logo头像

Edward.K Thinking

將VBA的RecordSet轉換Datatable類別

寫一篇關於將Datatable轉換成Vba可接受的RecordSet類別,如果把結果顛倒過來呢?這也是可以的。其主要目的是讓Excel內的資料上傳後,可以透RecordSet 轉換成 Datatable解析其中資料內容或是讓.Net可以快速針對內容作處理。

  1. 主要需要靠ADODB.Stream&ADODB.Recordset物件幫助。

    1
    2
    Type adoStreamType = Type.GetTypeFromProgID("ADODB.Stream");
    Type adoRecordsetType = Type.GetTypeFromProgID("ADODB.Recordset");
  2. 透過System.Activator物件幫忙進行轉換

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    string strXML =  //<-接Recordset format字串用
    DataSet ds = new DataSet();
    OleDbDataAdapter odb = new OleDbDataAdapter();
    Type adoStreamType = Type.GetTypeFromProgID("ADODB.Stream");
    Type adoRecordsetType = Type.GetTypeFromProgID("ADODB.Recordset");
    object adoStream = Activator.CreateInstance(adoStreamType);
    object adoRecordset = Activator.CreateInstance(adoRecordsetType);
    try
    {

    adoStreamType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, adoStream, new object[] { });
    adoStreamType.InvokeMember("WriteText", System.Reflection.BindingFlags.InvokeMethod, null, adoStream, new object[] { strXML });
    adoStreamType.InvokeMember("Position", System.Reflection.BindingFlags.SetProperty, null, adoStream, new object[] { 0 });

    adoRecordsetType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, adoRecordset, new object[] { adoStream });

    odb.Fill(ds, adoRecordset, "Tmp_Data");
    }
    catch (Exception ex)
    {
    clsWriteToLog.WriteToLog_E("oRecordSetToDatatable", ex.Message.ToString());
    }
    finally
    {
    odb.Dispose();
    odb = null;
    adoStreamType = null;
    adoRecordsetType = null;
    adoStream = null;
    adoRecordset = null;
    strXML = null;
    }

這樣就可以將Excel傳上來的RecordSet轉換成.Net可用的物件。

上一篇