我試圖運行下面的代碼,將大量記錄(從具有奇怪文件格式的文件中)插入到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