2010-06-07 67 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

相关问题