VBA 将整个 ADODB.Recordset 插入表中

Posted

技术标签:

【中文标题】VBA 将整个 ADODB.Recordset 插入表中【英文标题】:VBA Insert whole ADODB.Recordset into table 【发布时间】:2016-03-23 18:06:16 【问题描述】:

我正在尝试在 sql server(一些 DWH)上运行 SQL 查询,然后将结果插入到访问表中(使用 VBA)。 我是通过使用 ADODB.Connection、ADODB.Command 和 ADODB.Recordset 来完成的。此时我在 Recordset 中有我的结果,我想知道如何在不循环的情况下将它插入到表中。 我试过了:

If Not (Rs.EOF And Rs.BOF) Then  
    Rs.MoveFirst  
    Do Until Rs.EOF = True  
        DoCmd.RunSQL ("INSERT INTO Table (F1, F2) VALUES ( " & rs![F1] & ", " & rs[F2] & ")" 
        Rs.MoveNext  
    Loop  
End If

但是 Recordset 可能有超过 100k 行。所以使用这种方法插入它需要很长时间。

另一种非常快速的方法是打开一个新的 Excel 工作簿,将其粘贴到工作表中,然后将其导入。但我想避免它。有没有其他办法?

---------已编辑----------- 对不起大家。我的错。我用 VBA 强制解决方案,而 linkin 它是完美的。谢谢 !

【问题讨论】:

为什么要在 Access 中制作副本,这样的行会变慢并死掉。如果要创建 SQL 视图,并将 Access 链接到该视图。它仍然会很慢。 几个原因:1.) 我没有在 SQL Servers 上创建视图的权限(只读) 2.) 没有 SQL 知识的用户将使用访问权限 3.) VBA 不会做其他行动取决于用户的决定 好的,然后在 SQL 中运行您的查询,在结果页面中右键单击,然后选择副本(无标题)。打开 Access 表并单击最后一行并粘贴。 1.) 它将成为没有 SQL 知识(包括软件)的用户的工具 2.) 它将经常更新。因此,手动完成既浪费时间又不方便 3.) 我的政治观点:不要做可以自动完成的事情。 为什么不直接将 SQL 表链接到 Access,然后使用所需的值进行查询?这与在功能上(但不是性能)在 SQL Server 中拥有视图相同。 【参考方案1】:

我想知道是否有任何使用 Access 的快速方法 仅限资源。

如前所述,链接 SQL 表,然后创建一个简单的 append 查询,该查询从链接表中读取并写入您的 Access 表,然后您就完成了.

【讨论】:

【参考方案2】:

我同意评论者的观点,即您应该尽可能链接。但我想看看能不能做到。我最终将记录集转换为逗号分隔文件并使用TransferText 附加它。

Public Sub ImportFromSQLSvr()

    Dim rs As ADODB.Recordset
    Dim cn As ADODB.Connection
    Dim sResult As String
    Dim sFile As String, lFile As Long

    Const sIMPORTFILE As String = "TestImport.txt"

    Set cn = New ADODB.Connection
    cn.Open msCONN
    Set rs = cn.Execute("SELECT SiteID, StoreNumber FROM Site")

    'Add a header row, replace tabs with commas
    sResult = rs.GetString
    sResult = "SiteID, StoreNumber" & vbNewLine & sResult
    sResult = Replace(sResult, vbTab, ",")

    'Write to a text file
    lFile = FreeFile
    sFile = Environ("TEMP") & "\" & sIMPORTFILE
    Open sFile For Output As lFile
        Print #lFile, sResult
    Close lFile

    'Append to table dbo_Site
    DoCmd.TransferText acImportDelim, , "dbo_Site", Environ("TEMP") & "\" & sIMPORTFILE, True

    On Error Resume Next
        rs.Close
        Set rs = Nothing
        cn.Close
        Set cn = Nothing

End Sub

如果您的数据中有任何逗号,则需要做一些额外的工作来正确格式化 csv。

【讨论】:

我厌倦了。 xlsx/csv 文件是我想出的最快方法。逗号的解决方案是添加正确的导入/导出规范(例如在 "MSysIMEXspecs" 中添加记录)。但我想知道是否有任何仅使用 Access 资源的快速方法。

以上是关于VBA 将整个 ADODB.Recordset 插入表中的主要内容,如果未能解决你的问题,请参考以下文章

无法将“ADODB.Recordset”类型的对象转换为“MSDATASRC.DataSource”类型

VBA利用ADO操作EXCEL表

如何从此 ADODB.Recordset 中获取插入 ID?

excel VBA动态链接数据库

Excel 单元格到 ADODB.Recordset

由于空格,ADODB.Recordset 到 SQL Server 查询失败