将完整的ADO记录集插入现有的ACCESS表中无需循环

问题描述:

我的VBA模块中有一个填充好的ADO记录集。我在ACCESS中也有一个表,它与记录集具有完全相同的结构。将完整的ADO记录集插入现有的ACCESS表中无需循环

现在我用遍历每个数据集记录的循环(这很好)来填充表格。

我想知道:有没有办法将整个记录集插入访问表? (更重要的是:这会明显更快)

+0

https://support.microsoft.com/zh-cn/kb/195082显示使用断开的记录集执行更新:不确定有关插入... –

这里是一个基本的例子(在这种情况下从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

哎呀,我意识到我错过了最重要的部分。但我现在看到了。那正是我希望找到的。非常有用的感谢澄清 –

否。没有反向等价物 - 可能为SetRows - 方法GetRows

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