将 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 记录集转换为断开连接的 ADO 记录集 dbDecimal 问题
如何将 DAO 查询转换为 Yii2 ActiveRecord。如何从连接表中选择和使用特定列