【问题标题】:VBA Insert whole ADODB.Recordset into tableVBA 将整个 ADODB.Recordset 插入表中
【发布时间】: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 中拥有视图相同。

标签: sql-server vba ms-access


【解决方案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 资源的快速方法。
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2011-01-29
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    相关资源
    最近更新 更多