我的代码想要非常频繁地查询 Access 权限,我对每一行使用“for”并检查单元格的值是否存在于 Access 表中。但我感觉表演很差劲。现在我使用adodb.connection来连接 Access 。抱歉,我无法输入代码,因为它不在我手中。任何人都可以帮助我了解如何从 Excel VBA 频繁地查询表并具有快速的性能?
编辑:
For rowNum = 2 To 1000000
'check if title exists,if yes, get ppid, if not, insert one, get ppid, and make relation in r-table
ppID = isTitleExistReturnID(ppTitle)
If ppID = "0" Then
ppID = addPpReturnID(ppTitle, ppDate, ppJournal)
paperAddedCount = paperAddedCount + 1
isPpAdded = True
Else
isPpAdded = False
End If
Next rowNum
Function isTitleExistReturnID(title As String) As String
Dim r As New ADODB.Recordset
sqlstr = "select * from paper where title = '" & title & " '"
'MsgBox sqlstr
dbConnection.Open
r.Open sqlstr, dbConnection, adOpenKeyset, adLockOptimistic, adCmdText
If r.RecordCount < 1 Then
dbConnection.Close
isTitleExistReturnID = "0"
Else
aidi = r.Fields(0).Value
dbConnection.Close
isTitleExistReturnID = aidi
End If
End Function
Function addPpReturnID(title As String, pubDate As String, journaL As String) As String
Dim r As New ADODB.Recordset
sqlstr = "select * from paper where (1=0)"
'MsgBox sqlstr
dbConnection.Open
r.Open sqlstr, dbConnection, adOpenKeyset, adLockOptimistic, adCmdText
r.AddNew
r.Fields(1) = title
r.Fields(2) = pubDate
r.Fields(3) = journaL
r.Update
maxid = CStr(r.Fields(0).Value)
dbConnection.Close
addPpReturnID = maxid
End Function
以上是我的代码的一部分:
- 检查该项目是否在 Access 表中
- 如果是,则返回其 ID
- 如果否,请添加此项目并返回 ID
做了10万次以上,性能很低
任何建议都将不胜感激,提前致谢。
最佳答案
任何 RBAR (row by agonizing row)这种方法有可能成为性能挑战——这就是为什么它被称为痛苦的原因。
您的绝对是 RBAR,因为您为一百万(For rowNum = 2 To 1000000
)电子表格行中的每一行单独执行操作。使问题更加复杂的是,对于每一行,您至少要打开和关闭 ADODB 对象(连接和记录集)一次,但有时两次。
尝试寻找基于集合的方法。例如,如果您可以从 Access 驱动此操作...
- 创建电子表格的链接。
- 创建一个“不匹配”查询(有查询向导来指导您)以选择 Access 目标表中不存在
ppTitle
的电子表格行。 - 创建“追加”查询以将那些不匹配的行添加到 Access 表中。
我不知道该大纲是否适合您的情况,或者是否足够接近您可以进行调整。但更重要的一点是找到一种基于集合的方法来代替RBAR。
关于Excel 连接到 Access 时性能较低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16898254/