3

我的代码想要非常频繁地查询访问,我对每一行使用“for”并检查一个单元格的值是否存在于访问表中。但是我觉得性能很差。现在我使用 adodb.connection 来连接访问。抱歉,我无法输入代码,因为它不在我手中。任何人都可以帮助我了解如何从 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. 检查项目是否在访问表中
  2. 如果是,则返回其 ID
  3. 如果否,添加此项并返回 ID

做10万次以上,性能很低

任何建议将不胜感激,在此先感谢。

4

1 回答 1

1

任何RBAR(逐行痛苦)方法都有可能成为性能挑战——这就是为什么它被称为痛苦。

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

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

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

我不知道该大纲是否适合您的情况,或者是否足够接近您可以适应它。但更重要的一点是找到基于集合的方法而不是RBAR。

于 2013-10-10T17:46:23.537 回答