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

Bar*_*ven 9 ms-access vba ado recordset

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

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

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

Tim*_*ams 13

这是一个基本示例(在本例中从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
Run Code Online (Sandbox Code Playgroud)

  • @HarveyFrench - OP的问题开始"我有一个填充的ADO记录集",所以在我看来问题不是关于*填充*记录集,而是关于如何从OP已经拥有的记录集中插入那些记录*没有循环的表.我发布的代码是使用`UpdateBatch`方法执行此操作的示例.由于OP没有发布任何与创建记录集相关的代码,而且我感觉很懒,我使用目标表中的"无记录"选项创建了我的*example*记录集,以确保字段完全匹配. (2认同)