将完整的ADO Recordset插入现有的ACCESS表WITHOUT LOOP

时间:2015-09-28 11:14:05

标签: vba ms-access ado recordset

我的VBA模块中有一个填充的ADO记录集。我在ACCESS中也有一个表,它与记录集具有完全相同的结构。

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

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

4 个答案:

答案 0 :(得分:11)

这是一个基本示例(在本例中从excel运行),它说明了使用断开连接的记录集添加记录。

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

答案 1 :(得分:2)

VBA Recordsets几乎存在于运行时调用的内存中,直到它们被包含到保存到硬盘的实际物理格式(即csv,txt,xlsx,xml,数据库临时表)中。这类似于R或Python pandas中的数据框,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查询

答案 2 :(得分:0)

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

答案 3 :(得分:0)

要使用SQL语句完成此操作,请使用SELECT / INSERT ... IN记录发布到]或FROM ... IN [指定DB B;记录原始来源]

您只能在单个查询中使用一次IN语句。因此,您可以使用ADODB连接来创建另一个连接,以确定另一个源连接。

hover_data=['text']

如果从单个外部表中进行选择,我将使用上面的代码以及本地ADODB连接。

Function example()
Dim dB_External As String
Dim db_Local As String
Dim cnLocal As ADODB.Connection
Dim cnExternal As ADODB.Connection

Set cnLocal = CurrentProject.Connection
Set cnExternal = New ADODB.Connection
cnExternal .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\\...accdb;Persist Security Info=False;"

dB_External = "C:\Users\\...accdb"
db_LOCAL = "C:\Users\\...accdb"

Example A:
strSQL = "INSERT INTO *Local table to receive records* (Column Designations)"
strSQL = strSQL & " SELECT ( *Corresponding records from external table* )"
strSQL = strSQL & " FROM *External table name* IN '" & dB_External & "'"
cnLocal.Execute (strSQL)

如果选择在外部数据库中联接多个表,则我使用上述代码通过外部ADODB连接。