MS Access:为什么Adodb.RecordSet.batchupdate比application.importxml慢得多?
-
24-10-2019 - |
题
我正在尝试运行下面的代码,以将大量记录(从具有怪异文件格式的文件)插入从VBA访问2003数据库中。经过许多实验,此代码是我能够提出的最快的代码:它在我的机器上大约15秒内完成了10000张记录。其中至少有14.5秒(即几乎所有时间)都在单一调用更新键。
我在其他地方读到,喷气引擎不支持更新键。因此,也许有更好的方法可以做到。
现在,我只是认为喷气发动机很慢,但不能。在使用下面的代码生成“ testy”表后,我右键单击它,选择导出并将其保存为XML。然后,我右键单击,选择导入并重新加载XML。总时间导入XML文件?不到一秒钟,即。至少更快15倍。
当然,有一种有效的方法可以将数据插入不需要编写临时文件的访问中?
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 ++。但是我似乎找不到。不可能是该应用程序。ImportXML正在使用无证件的API,对吗?
解决方案
除非您必须使用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
不隶属于 StackOverflow