2010-06-07 95 views
4

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

+0

此外,這個查詢運行得非常快速:「插入testy選擇top * 10000 * from testy」。少於一秒的方式。所以顯然插入10000行不是JET遇到的問題。 – apenwarr 2010-06-07 03:03:35

回答

2

除非您必須對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 
+0

聖牛,我不敢相信!你是對的!我以爲我曾嘗試過*所有*,但我忘了這一個!順便說一句,「插入...」查詢(每行一個)與DAO超慢,但你的方法確實大大加快。謝謝! – apenwarr 2010-06-07 06:10:28

+0

另一個需要注意的是:如果你正在通過COM編組來處理來自另一個進程(如C程序)的MSACCESS.EXE進程,上述方法會很慢,但如果你正在MSACCESS.EXE進程中運行(如訪問VBA)。 您可以通過使用CreateObject(「DAO.DBEngine.36」)OpenDatabase()來解決緩慢問題,它可以在當前進程中創建DAO實例並避免編組。差異大約是30倍加速!在C程序中,這意味着800插入/秒對比我24000插入/秒。 – apenwarr 2010-06-07 16:29:06

相關問題