MS Access-CopyFromRecordset

Posted

技术标签:

【中文标题】MS Access-CopyFromRecordset【英文标题】: 【发布时间】:2017-06-27 11:14:56 【问题描述】:

我正在使用以下代码从数据库中获取记录。我有超过 5,000,000 条记录。下面的代码在 Sheet 2 中提取 1048576 条记录并粘贴。有人可以帮我循环它,以便它从 sheet1 中提取所有记录并将其放置在 sheet2 中而不是 sheet3 中,直到所有记录都被粘贴。

Dim objWkb As Excel.Workbook
Dim objSht As Excel.Worksheet
Dim db As Database
Dim rs As Recordset
Dim intLastCol As Integer
Const conMAX_ROWS = 20000
Const conSHT_NAME = "Sheet2"
Const conWKB_NAME = "\\workbook path\a\b\c\Work.xlsm"
  Set db = CurrentDb
  Set objXL = New Excel.Application
  Set rs = db.OpenRecordset("Database", dbOpenSnapshot)
  With objXL
    .Visible = True
    Set objWkb = .Workbooks.Open(conWKB_NAME)
    On Error Resume Next
    Set objSht = objWkb.Worksheets(conSHT_NAME)
    If Not Err.Number = 0 Then
      Set objSht = objWkb.Worksheets.Add
      objSht.Name = conSHT_NAME
    End If
    Err.Clear
    On Error GoTo 0
    intLastCol = objSht.UsedRange.Columns.Count
    With objSht
      .Range(.Cells(1, 1), .Cells(conMAX_ROWS, _
          intLastCol)).ClearContents
      .Range(.Cells(1, 1), _
        .Cells(1, rs.Fields.Count)).Font.Bold = True
      .Range("A2").CopyFromRecordset rs
    End With
  End With
  Set objSht = Nothing
  Set objWkb = Nothing
  Set objXL = Nothing
  Set rs = Nothing
  Set db = Nothing
End Sub

【问题讨论】:

为什么单个文件需要 5m 条记录?我猜该文件将需要 forever 来保存,并且需要更长的时间来加载(如果它加载的话)。 Excel 可能允许 100 万行,但它不是为滥用而设计的。 无论您认为在 Excel 中需要 500 万行的原因是什么,都是错误的。没有 Excel 工作表永远需要处理这么多数据。您将对其进行聚合、汇总、查找等 - 让 SQL 后端完成这项工作,并且只向 Excel 提供它需要的数据。这是一个明显的 X-Y 问题:您正在解决一个症状(太多数据无法适应工作表)而不是手头的实际问题(疯狂猜测,您正在制作一些报告),使 Excel 完成了数据库的工作。 【参考方案1】:

不是一个完整的答案,由于不确定表的结构,但是使用带有主键的表,我做了以下操作,您需要对记录进行计数并据此设置循环,但沿着这些思路设置循环

Sub test()

    Dim strsql As String
    Dim l As Long
    Dim x As Long  ' x will be recordcount/ l

    l = 10000   ' max rows

    For x = 1 To 3
        strsql = "select top " & l & " y.* from (" & _
                "Select top " & (x * l) & " * from [Table] order by [ID] desc" & _
                ") as Y order by y.id asc"
        Debug.Print strsql 
    Next x

    End Sub

这样会生成 SQL

select top 10000 y.* from (Select top 10000 * from [Table] order by [ID] desc) as Y order by y.id asc
select top 10000 y.* from (Select top 20000 * from [Table] order by [ID] desc) as Y order by y.id asc
select top 10000 y.* from (Select top 30000 * from [Table] order by [ID] desc) as Y order by y.id asc

编辑

Sub test()

    Dim strsql As String
    Dim l As Long
    Dim x As Long  ' x will be recordcount/ l
    dim rst as adodb.recordset

    l = 10000

    For x = 1 To (dcount("id","table")/l)
        strsql = "select top " & l & " y.* from (" & _
                "Select top " & (x * l) & " * from [Table] order by [ID] desc" & _
                ") as Y order by y.id asc"
    set rst=new adodb.recordset
    rst.open strSQL, currentproject.connection, adOpenKeySet
        worksheets(x).range("a1").copyfromrecordset rst
    Next x

End Sub

希望对你有帮助

【讨论】:

这不是每次都能让您获得相同的前 10000 条记录吗?我相信 TOP 按 PK 顺序拉,所以你所做的就是从越来越大的 [Table] 子集中获取相同的 10,000 条记录。 我的错。由于 PK 排序,您不会得到相同的 10,000 行。您将根据Order by ID 选择更大、不同的Table 子集,但是您获得no telling 其中10,000 行这些子集。 不,请参阅图像编辑。它依赖于一个可排序的字段,正如我在回答中所逃避的那样,但是 o/p 没有共享数据。有记录集移动和循环方法,但也不是最好的。 如前所述,我的 cmets 适用。正如您的屏幕截图中所写,您是正确的。您的代码缺少屏幕截图中显示的额外 order by y.id 嗨,Nathan,我在 rst.open strSQL、currentproject.connection、adOpenKeySet 处遇到错误。 select 语句包含一个保留字,或者标点符号不正确。或者参数名称不正确或丢失。请帮助纠正它【参考方案2】:

这在 Excel 中,现在,或者在我们的有生之年可能永远都行不通。考虑使用免费的 SQL Server express 或同样免费的 R。

【讨论】:

以上是关于MS Access-CopyFromRecordset的主要内容,如果未能解决你的问题,请参考以下文章

Kafka10.1 heartbeat.interval.ms、session.timeout.ms和max.poll.interval.ms

调度的log 1.5ms 12ms 4ms

如何在 PHP 中将“MM:SS.MS”转换为“SS.MS”?

如何使用360 安装 ms17-010

解密/读取/修改“.automaticDestinations-ms”和/或“.customDestinations-ms”

1ns=几ms?