作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试运行下面的代码,将大量记录(来自具有奇怪文件格式的文件)从 VBA 插入到我的 Access 2003 数据库中。经过无数次的实验,这段代码是我能想到的最快的代码:它在我的机器上大约 15 秒内完成了 10000 条记录。其中至少 14.5 秒(即几乎所有时间)都在对 UpdateBatch 的单个调用中。
我在别处读到 JET 引擎不支持 UpdateBatch。所以也许有更好的方法来做到这一点。
现在,我只是认为 JET 引擎很慢,但事实并非如此。使用下面的代码生成“testy”表后,我右键单击它,选择“导出”,并将其保存为 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
最佳答案
除非您必须使用 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
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
关于ms-access - MS Access : Why is ADODB. Recordset.BatchUpdate 比 Application.ImportXML 慢这么多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2986831/
我是一名优秀的程序员,十分优秀!