MS Access:为什么ADODB.Recordset.BatchUpdate比Application.ImportXML慢得多?

时间:2010-06-07 02:50:29

标签: ms-access vba ado access-vba ms-jet-ace

我正在尝试运行下面的代码,将大量记录(从具有奇怪文件格式的文件)插入到VBA的Access 2003数据库中。经过许多实验,这段代码是我能够提出的最快的代码:它在我的机器上大约15秒内完成10000条记录。这些秒中至少有14.5(即几乎所有时间)都在UpdateBatch的单次调用中。

我在其他地方读过JET引擎不支持UpdateBatch。所以也许有更好的方法来做到这一点。

现在,我认为JET引擎很慢,但不是这样。使用下面的代码生成'testy'表后,我右键单击它,选择Export,并将其保存为XML。然后我右键单击,选择Import,然后重新加载XML。导入XML文件的总时间?不到一秒钟,即。至少快15倍。

当然有一种将数据插入Access的有效方法,不需要编写临时文件吗?

Sub TestBatchUpdate()
    CurrentDb.Execute "create table testy (x int, y int)"

    Dim rs As New ADODB.Recordset
    rs.CursorLocation = adUseServer
    rs.Open "testy", CurrentProject.AccessConnection, _
        adOpenStatic, adLockBatchOptimistic, adCmdTableDirect

    Dim n, v
    n = Array(0, 1)
    v = Array(50, 55)

    Debug.Print "starting loop", Time
    For i = 1 To 10000
        rs.AddNew n, v
    Next i
    Debug.Print "done loop", Time

    rs.UpdateBatch
    Debug.Print "done update", Time

    CurrentDb.Execute "drop table testy"
End Sub

如果有一些API允许我以这种方式快速插入,我愿意使用C / C ++。但我似乎无法找到它。它不能是Application.ImportXML使用未记录的API,可以吗?

1 个答案:

答案 0 :(得分:3)

除非您必须使用ADO执行此操作,否则请尝试使用DAO。以下是我的笔记本电脑上的程序和DAO版本的时间:

ADO:
starting loop 9:51:59 PM
done loop     9:52:00 PM
done update   9:52:54 PM

DAO:
starting loop 9:58:29 PM
done loop     9:58:31 PM
done update   9:58:31 PM

这是我使用的DAO版本。

Sub TestBatchUpdateDAO()

    CurrentDb.Execute "create table testy (x int, y int)"

    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("testy", dbOpenTable, dbAppendOnly)
    Dim i As Long

    Debug.Print "starting loop", Time
    For i = 1 To 10000
        rs.AddNew
        rs!x = 50
        rs!y = 55
        rs.Update
    Next i
    Debug.Print "done loop", Time

    'rs.UpdateBatch '
    Debug.Print "done update", Time

    rs.Close
    Set rs = Nothing
    CurrentDb.Execute "drop table testy"
End Sub