MapX 為 COM 元件,僅支援 ADO Recordset;C# 慣用 ADO.NET DataTable,需轉換橋接。
public sealed class AdoNetToAdo
{
public static ADODB.Recordset ConvertDataTableToRecordset(DataTable table)
{
var rs = new ADODB.RecordsetClass();
// 1. 建立 Fields 對應 DataColumn
foreach (DataColumn dc in table.Columns)
{
rs.Fields.Append(dc.ColumnName, GetAdoType(dc.DataType), -1,
FieldAttributeEnum.adFldIsNullable, Type.Missing);
}
// 2. 開啟 Recordset 並填入資料
rs.Open(Type.Missing, Type.Missing, CursorTypeEnum.adOpenUnspecified,
LockTypeEnum.adLockUnspecified, -1);
foreach (DataRow dr in table.Rows)
{
rs.AddNew(Type.Missing, Type.Missing);
for (int i = 0; i < table.Columns.Count; i++)
rs.Fields[i].Value = dr[i];
}
return rs;
}
private static DataTypeEnum GetAdoType(Type netType)
{
return netType.ToString() switch
{
"System.Boolean" => DataTypeEnum.adBoolean,
"System.Byte" => DataTypeEnum.adUnsignedTinyInt,
"System.Char" => DataTypeEnum.adChar,
"System.DateTime" => DataTypeEnum.adDate,
"System.Decimal" => DataTypeEnum.adDecimal,
"System.Double" => DataTypeEnum.adDouble,
"System.Int16" => DataTypeEnum.adSmallInt,
"System.Int32" => DataTypeEnum.adInteger,
"System.Int64" => DataTypeEnum.adBigInt,
"System.SByte" => DataTypeEnum.adTinyInt,
"System.Single" => DataTypeEnum.adSingle,
"System.String" => DataTypeEnum.adVarChar,
"System.UInt16" => DataTypeEnum.adUnsignedSmallInt,
"System.UInt32" => DataTypeEnum.adUnsignedInt,
"System.UInt64" => DataTypeEnum.adUnsignedBigInt,
_ => throw new Exception($"無對應 ADO 型別: {netType}")
};
}
}
Fields.Append 需指定 ADO 型別 (DataTypeEnum)、長度 (-1 表最大)、屬性 (可 Null)。rs.Open 參數多為 Type.Missing 使用預設值。AddNew + 逐欄位賦值,Fields[i] 以序數存取對應 DataColumn 順序。