2015-09-28 64 views
5

我的VBA模塊中有一個填充好的ADO記錄集。我在ACCESS中也有一個表,它與記錄集具有完全相同的結構。將完整的ADO記錄集插入現有的ACCESS表中無需循環

現在我用遍歷每個數據集記錄的循環(這很好)來填充表格。

我想知道:有沒有辦法將整個記錄集插入訪問表? (更重要的是:這會明顯更快)

+0

https://support.microsoft.com/zh-cn/kb/195082顯示使用斷開的記錄集執行更新:不確定有關插入... –

回答

6

這裏是一個基本的例子(在這種情況下從excel運行),它說明了使用斷開的記錄集來添加記錄。直到它們被包含到一個實際的物理格式(即,CSV,TXT,XLSX,XML,數據庫臨時表)保存到硬盤

Sub Tester() 

    Dim con As ADODB.Connection, rs As ADODB.Recordset 
    Dim i As Long 

    Set con = getConn() 

    Set rs = New ADODB.Recordset 
    rs.CursorLocation = adUseClient '<<<< important! 

    'get an empty recordset to add new records to 
    rs.Open "select * from Table1 where false", con, _ 
      adOpenDynamic, adLockBatchOptimistic 

    'disconnect the recordset and close the connection 
    Set rs.ActiveConnection = Nothing 
    con.Close 
    Set con = Nothing 

    'add some new records to our test recordset 
    For i = 1 To 100 
     rs.AddNew 
     rs("UserName") = "Newuser_" & i 
    Next i 

    'reconnect to update 
    Set con = getConn() 
    Set rs.ActiveConnection = con 

    rs.UpdateBatch '<<< transfer to DB happens here: no loop! 

    rs.Close 

    'requery to demonstrate insert was successful 
    rs.Open "select * from Table1", con, _ 
      adOpenDynamic, adLockBatchOptimistic 

    Do While Not rs.EOF 
     Debug.Print rs("ID").Value, rs("UserName").Value 
     rs.MoveNext 
    Loop 

    rs.Close 
    con.Close 
End Sub 

Function getConn() As ADODB.Connection 
    Dim rv As New ADODB.Connection 
    Dim strConn As String 

    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" _ 
    & "Data Source = " & ThisWorkbook.Path & "\Test.accdb" 

    rv.Open strConn 
    Set getConn = rv 
End Function 
+0

謝謝,我使用類似的東西。問題是如何避免使用循環,並簡單地將整個記錄集轉儲到表中,例如您可以在兩個訪問表之間執行操作(SELECT * INTO SomeTable FROM SomewhereElse) 但仍然有用! –

+0

我唯一的循環是加載測試記錄集並在更新後顯示結果。數據加載全部發生在單個「UpdateBatch」行中。你指的是什麼循環? –

+0

哎呀,我意識到我錯過了最重要的部分。但我現在看到了。那正是我希望找到的。非常有用的感謝澄清 –

0

否。沒有反向等價物 - 可能爲SetRows - 方法GetRows

1

VBA記錄集在存儲器運行期間調用實際上存在。這類似於R或Python熊貓,SAS數據集,PHP數組和其他數據結構中的數據框。

考慮使用CopyFromRecordset方法將這種格式的ADO導出到Excel電子表格中,以保存爲csv,txt,xlsx或xml。或者,您可以使用Save方法將記錄集保存爲xml等持久格式類型。

然後,得到的文件附加到MS Access表與它的自動化數據遷移功能:

  • 對於電子表格:DoCmd.TransferSpreadsheet
  • 對於TXT,CSV或其它分隔文件:DoCmd.TransferText
  • 用於XML文件:Application.ImportXML
  • 對於本地或ODBC/OLEDB連接數據庫表:INSERT INTO追加SQL查詢

+0

ADO到Excel訪問。聽起來它會比循環INSERT語句更快。遺憾的是,你不能用一條SELECT語句寫入一條插入到表中的SQL語句,該語句從一個記錄集中獲取數據(或者是一個數組...... ..... Hmm。VALUES ... – HarveyFrench