将 ADODB 循环转换为 DAO

Posted

技术标签:

【中文标题】将 ADODB 循环转换为 DAO【英文标题】:Converting ADODB Loop into DAO 【发布时间】:2015-09-09 08:01:51 【问题描述】:

您好,我一直在开发一个 vba 项目,这里的示例提供了很多帮助。我正在尝试从 Excel VBA 访问 MS Access 数据库,并根据请求导入大型数据集(500-100+ 行)。

目前,以下循环使用 ADODB 工作,但是 Range("").Copyfromrecordset 行每个请求花费了大约 7 秒的时间。

 Public Sub BC_Data()

Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
Dim strCon, SQL As String
Dim ID As Integer

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=...\Database.accdb;"

cn.Open strCon
    For i = 0 To n
        ID = Range("A2").Offset(i, 0).Value
        SQL = "SELECT [Sales] WHERE [ID] = " & ID & _
        " AND [Date] >= #" & [A1].Text & "# AND [Date] <= #" & _
        [B1].Text & "#;"
        rs.Open SQL, cn
        Range("C2").Offset(0, i).CopyFromRecordset rs
        rs.Close
    Next
cn.Close

Set rs = Nothing
Set cn = Nothing

End Sub

SQL 工作正常,只是为给定的产品 ID 和时间段选择每个事务。

我使用这种循环的原因是我们一次只需要大约 20 个产品的数据,而且它们不一定按顺序排列,因此 ID 可能是 1、2、4, 7、200、205、654等

ID 存储在 A 列中,然后请求循环遍历并将每个新列粘贴到 C 列中。

我有两个问题:

    使用 DAO 连接而不是 ADODB 会加速这个过程吗?如果是这样,我将如何在 DAO 中复制它?

    我用来循环遍历 ID 然后请求有效的方法吗?有没有更快的方法,也许使用“For each”循环代替?

谢谢!

【问题讨论】:

【参考方案1】:

DAO 可能会快一点,但不是实质性的。相反,请在 SQL 语句中使用 IN 子句,这样您只需执行一次。

Sub test()

    Dim vaIds As Variant
    Dim sSql As String

    vaIds = Split("1 2 4 7 200 205 654", Space(1))

    sSql = "SELECT [Sales] WHERE [ID] In(" & Join(vaIds, ",") & ")" & _
        " AND [Date] >= #" & [A1].Text & "# AND [Date] <= #" & _
        [B1].Text & "#;"

    Debug.Print sSql

End Sub

【讨论】:

以上是关于将 ADODB 循环转换为 DAO的主要内容,如果未能解决你的问题,请参考以下文章

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

字符串不能转换为 DAO Receiver

将 DAO 记录集转换为断开连接的 ADO 记录集 dbDecimal 问题

如何将 DAO 查询转换为 Yii2 ActiveRecord。如何从连接表中选择和使用特定列

将 BigDecimal 转换为 Integer 时出现问题

详解DAO、ADO、ADODC和ADODB的区别和联系