Excel以低性能连接到Access

时间:2013-06-03 13:45:27

标签: excel vba ms-access sql-update

我的代码想要非常频繁地查询访问,我对每一行使用“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
  4. 执行次数超过100,000次,性能非常低

    任何建议都会非常感谢,提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

你的肯定是RBAR,因为你为每一百万(For rowNum = 2 To 1000000)个电子表格行分别做了一些东西。使问题更加复杂的是,您为这些行中的每一行打开和关闭ADODB对象(连接和记录集)至少一次,有时两次。

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

驱动此操作
  1. 创建指向电子表格的链接。
  2. 创建“不匹配”查询(有一个查询向导可以指导您),以选择Access目标表中不存在ppTitle的电子表格行。
  3. 创建一个“追加”查询,将这些不匹配的行添加到Access表中。
  4. 我不知道这个轮廓是否适合您的情况,或者它是否足够接近您可以适应它。但更重要的一点是找到一个基于集合的方法而不是RBAR。