我的代码想要非常频繁地查询访问,我对每一行使用“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
以上是我的代码的一部分:
执行次数超过100,000次,性能非常低
任何建议都会非常感谢,提前谢谢。
答案 0 :(得分:1)
任何RBAR (row by agonizing row)方法都有可能成为性能挑战 - 这就是为什么它被称为痛苦。
你的肯定是RBAR,因为你为每一百万(For rowNum = 2 To 1000000
)个电子表格行分别做了一些东西。使问题更加复杂的是,您为这些行中的每一行打开和关闭ADODB对象(连接和记录集)至少一次,有时两次。
尝试找到基于集合的方法。例如,如果您可以从Access ...
驱动此操作ppTitle
的电子表格行。我不知道这个轮廓是否适合您的情况,或者它是否足够接近您可以适应它。但更重要的一点是找到一个基于集合的方法而不是RBAR。