首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# MapX 二次開發 (1/1):DataTable 轉 ADO Recordset 完整實作

     編輯:關於C語言

背景

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 順序。
  • 型別對照表涵蓋常見 CLR 型別,缺漏可自行擴充。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved