在.NET框架中,经常需要将ADO.NET的DataTable对象转换为ADODB.Recordset对象,以便与旧的ASP页面兼容。如果这些页面基于ADODB.Recordset的操作,那么将它们暴露为ADO.NET DataTable可能会遇到一些困难。现有的解决方案通常旨在生成一个完全一致的DataTable副本,以允许更新。但在许多情况下,这种需求并不存在,而且这些解决方案的额外负担和脆弱性是不必要的。
本文提供了一个简单的代码片段,展示了认为最简单的方法来处理从ADO.NETDataTable到ADODB.Recordset的转换,然后可以像处理旧的中间件组件一样处理它。
设计了两个函数,作为某个帮助类中的静态成员。主函数如下:
        public static 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;
        }
    
辅助函数(可以轻松扩展)将.NET数据类型映射到正确的ADODB字段类型枚举。
        public 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;
            }
        }