简化ADO.NET DataTable到ADODB.Recordset的转换

在.NET框架中,经常需要将ADO.NETDataTable对象转换为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; } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485