Excel 连接到 Access 时性能较低

标签 excel vba ms-access sql-update

我的代码想要非常频繁地查询 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

以上是我的代码的一部分:

  1. 检查该项目是否在 Access 表中
  2. 如果是,则返回其 ID
  3. 如果否,请添加此项目并返回 ID

做了10万次以上,性能很低

任何建议都将不胜感激,提前致谢。

最佳答案

任何 RBAR (row by agonizing row)这种方法有可能成为性能挑战——这就是为什么它被称为痛苦的原因。

您的绝对是 RBAR,因为您为一百万(For rowNum = 2 To 1000000)电子表格行中的每一行单独执行操作。使问题更加复杂的是,对于每一行,您至少要打开和关闭 ADODB 对象(连接和记录集)一次,但有时两次。

尝试寻找基于集合的方法。例如,如果您可以从 Access 驱动此操作...

  1. 创建电子表格的链接。
  2. 创建一个“不匹配”查询(有查询向导来指导您)以选择 Access 目标表中不存在 ppTitle 的电子表格行。
  3. 创建“追加”查询以将那些不匹配的行添加到 Access 表中。

我不知道该大纲是否适合您的情况,或者是否足够接近您可以进行调整。但更重要的一点是找到一种基于集合的方法来代替RBAR。

关于Excel 连接到 Access 时性能较低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16898254/

相关文章:

excel - 在 Excel 中使用命名范围进行搜索时,运行时错误 1004 object_global 的方法范围失败

vba - Excel VBA : Can I query external excel without opening the target file?

sql - MS Access - 对同名列执行 "full join"的替代方法

vba - 如何对多个复选框执行相同的代码来设置复选框值?

vba - Excel工作表运行时错误13 : Type mismatch.

vba - Excel 的随机数生成器根本不是随机的?

excel - 如何在 Excel 中使用宏发送邮件时抑制 Outlook 警告

excel - 范围内每个单元格的边框

ms-access - 如何在 Yes/No 字段的 MS Access 查询中将 Yes 和 No 作为行值?

ms-access - Access 2007 - Left Join 查询返回 #Error 而不是 Null