我试图运行下面的代码,将大量记录(从具有奇怪文件格式的文件中)插入到VBA中的Access 2003数据库中。经过许多实验之后,这些代码是我能够提出的最快的代码:它在我的机器上在大约15秒内完成了10000条记录。这些秒中的至少14.5(即几乎所有时间)都在对UpdateBatch的单个调用中。MS Access:为什么ADODB.Recordset.BatchUpdate比Application.ImportXML慢得多?
我在其他地方看过JET引擎不支持UpdateBatch。所以也许有更好的方法来做到这一点。
现在,我只是认为JET引擎很慢,但那不可能。用下面的代码生成'testy'表后,我右键单击它,选择Export,然后将其保存为XML。然后我右键单击,选择导入,然后重新加载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
我会愿意诉诸C/C++,如果有一些API可以让我做这种快速插入。但我似乎无法找到它。它不可能是Application.ImportXML使用未记录的API,可以吗?
此外,这个查询运行得非常快速:“插入testy选择top * 10000 * from testy”。少于一秒的方式。所以显然插入10000行不是JET遇到的问题。 – apenwarr 2010-06-07 03:03:35