Click here to Skip to main content
6,305,776 members and growing! (15,204 online)
Email Password   helpLost your password?
Database » Database » General     Intermediate License: The Microsoft Public License (Ms-PL)

Simplest code to convert an ADO.NET DataTable to an ADODB.Recordset

By Marc Brooks

Simple C# code to convert an ADO.NET (System.Data) DataTable to an ADODB Recordset.
C#, VC7.1, Windows, DotGNU, Visual Studio, ADO, ADO.NET, DBA, Dev
Posted:27 May 2005
Views:54,824
Bookmarked:21 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
15 votes for this article.
Popularity: 4.46 Rating: 3.79 out of 5

1
3 votes, 20.0%
2

3
4 votes, 26.7%
4
8 votes, 53.3%
5

Introduction

When working with a legacy ASP application, you might want to convert the core business objects to .NET class libraries while still allow the use of existing ASP pages. If those pages are based on manipulating ADODB Recordsets, it can be a real pain to expose them as an ADO.NET DataTable.

The existing examples I've seen are oriented around generating a full-fidelity replica of the DataTable which allows updates. In many situations, this is not needed and the added burden and fragility of these solutions is not warranted.

This article is a quick code snippet that shows what I believe is the simplest possible way to handle the conversion from an ADO.NET DataTable to an ADODB.Recordset, which can then be handled as if it was still coming from the older middleware component.

The Code

There are two functions, designed to be include as static members of some helper class. The main function is simple:

static public ADODB.Recordset ConvertToRecordset(DataTable inTable)
{
    ADODB.Recordset result = new ADODB.Recordset();
    result.CursorLocation = ADODB.CursorLocationEnum.adUseClient;

    ADODB.Fields resultFields = result.Fields;
    System.Data.DataColumnCollection inColumns = inTable.Columns;

    foreach (DataColumn inColumn in inColumns)
    {
        resultFields.Append(inColumn.ColumnName
            , TranslateType(inColumn.DataType)
            , inColumn.MaxLength
            , inColumn.AllowDBNull ? ADODB.FieldAttributeEnum.adFldIsNullable : 
                                     ADODB.FieldAttributeEnum.adFldUnspecified
            , null);
    }

    result.Open(System.Reflection.Missing.Value
            , System.Reflection.Missing.Value
            , ADODB.CursorTypeEnum.adOpenStatic
            , ADODB.LockTypeEnum.adLockOptimistic, 0);

    foreach (DataRow dr in inTable.Rows)
    {
        result.AddNew(System.Reflection.Missing.Value, 
                      System.Reflection.Missing.Value);

        for (int columnIndex = 0; columnIndex < inColumns.Count; columnIndex++)
        {
            resultFields[columnIndex].Value = dr[columnIndex];
        }
    }

    return result;
}

A helper function (which can easily be extended) maps the .NET data types to the correct ADODB field type enumeration.

static ADODB.DataTypeEnum TranslateType(Type columnType)
{
    switch (columnType.UnderlyingSystemType.ToString())
    {
        case "System.Boolean":
            return ADODB.DataTypeEnum.adBoolean;

        case "System.Byte":
            return ADODB.DataTypeEnum.adUnsignedTinyInt;

        case "System.Char":
            return ADODB.DataTypeEnum.adChar;

        case "System.DateTime":
            return ADODB.DataTypeEnum.adDate;

        case "System.Decimal":
            return ADODB.DataTypeEnum.adCurrency;

        case "System.Double":
            return ADODB.DataTypeEnum.adDouble;

        case "System.Int16":
            return ADODB.DataTypeEnum.adSmallInt;

        case "System.Int32":
            return ADODB.DataTypeEnum.adInteger;

        case "System.Int64":
            return ADODB.DataTypeEnum.adBigInt;

        case "System.SByte":
            return ADODB.DataTypeEnum.adTinyInt;

        case "System.Single":
            return ADODB.DataTypeEnum.adSingle;

        case "System.UInt16":
            return ADODB.DataTypeEnum.adUnsignedSmallInt;

        case "System.UInt32":
            return ADODB.DataTypeEnum.adUnsignedInt;

        case "System.UInt64":
            return ADODB.DataTypeEnum.adUnsignedBigInt;

        case "System.String":
        default:
            return ADODB.DataTypeEnum.adVarChar;
    }
}

Gotchas

  • You have to define the fields in the Recordset before you call the Open method or ADODB will give you an error.
  • This is a disconnected Recordset, so it cannot be used to update a table without further handling.
  • It only copies over the "current" values of the columns.
  • It copies all the rows, so be careful with large row-sets.

Other Articles

License

This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)

About the Author

Marc Brooks


Member

Occupation: Web Developer
Location: United States United States

Other popular Database articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 16 of 16 (Total in Forum: 16) (Refresh)FirstPrevNext
GeneralThanx! [modified] PinmemberDennis Betten14:57 13 Mar '08  
GeneralError in parsing a TIME column Pinmemberfiwi463pfa0:08 2 Apr '07  
GeneralRe: Error in parsing a TIME column PinmemberTim McCurdy10:37 19 Sep '07  
Generaladodb to ado.net Pinmembersmurfnz13:12 16 Jan '07  
General"System.byte[]" Pinmemberjwcarroll6:22 21 Sep '06  
GeneralFix Pinmemberjwcarroll6:29 21 Sep '06  
GeneralOne more thing... Pinmemberjwcarroll6:37 21 Sep '06  
GeneralRe: One more thing... PinmemberTim McCurdy10:40 19 Sep '07  
GeneralGreat article PinmemberDummyDUmb10:11 8 Sep '06  
GeneralRe: Great article PinmemberMarc Brooks10:30 8 Sep '06  
GeneralProblem AddNew Pinmemberrbarzallo8:02 17 May '06  
GeneralRe: Problem AddNew Pinmemberrbarzallo8:39 17 May '06  
GeneralRe: Problem AddNew PinmemberTim McCurdy10:41 19 Sep '07  
GeneralFunction to convert ADODB.DataTypeEnum to System.Type PinmemberMichael Freidgeim17:37 12 Nov '05  
GeneralError trying example PinsussJonBrune11:21 12 Oct '05  
GeneralRe: Error trying example PinmemberFranck Quintana12:49 8 Nov '05  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 27 May 2005
Editor: Smitha Vijayan
Copyright 2005 by Marc Brooks
Everything else Copyright © CodeProject, 1999-2009
Web18 | Advertise on the Code Project