这是对这个线程的一种跟进。这就是.Net 2.0的全部内容;至少对我来说。
本质上,Marc(上面的 OP)尝试了几种不同的方法来更新具有 100,000 条记录的 MS Access 表,并发现使用 DAO 连接比使用 ADO.Net快大约 10 到 30 倍。我走了几乎相同的路径(下面的示例)并得出了相同的结论。
我想我只是想了解为什么OleDB 和 ODBC 这么慢,我很想知道自 2011 年那篇文章以来是否有人找到比 DAO 更好的答案。我真的更愿意避免 DAO 和/或自动化,因为他们将要求客户端计算机具有可再分发的 Access 或数据库引擎(或者我坚持使用不支持 .ACCDB 的 DAO 3.6)。
最初的尝试;100,000 条记录/10 列约 100 秒:
Dim accessDB As New OleDb.OleDbConnection( _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
accessPath & ";Persist Security Info=True;")
accessDB.Open()
Dim accessCommand As OleDb.OleDbCommand = accessDB.CreateCommand
Dim accessDataAdapter As New OleDb.OleDbDataAdapter( _
"SELECT * FROM " & tableName, accessDB)
Dim accessCommandBuilder As New OleDb.OleDbCommandBuilder(accessDataAdapter)
Dim accessDataTable As New DataTable
accessDataTable.Load(_Reader, System.Data.LoadOption.Upsert)
//This command is what takes 99% of the runtime; loops through each row and runs
//the update command that is built by the command builder. The problem seems to
//be that you can't change the UpdateBatchSize property with MS Access
accessDataAdapter.Update(accessDataTable)
无论如何,我觉得这真的很奇怪,所以我尝试了几种相同的口味:
- 为 ODBC 切换 OleDB
- 循环遍历数据表并为每一行运行一个 INSERT 语句
- 这就是 .Update 的作用
- 使用 ACE 提供程序而不是 Jet(ODBC 和 OleDB)
- 从 DataReader.Read 循环中运行数据适配器更新
- 出于沮丧;这很有趣。
最后,我尝试使用 DAO。代码基本上应该做同样的事情;但显然不是,因为它在大约 10 秒内运行。
Dim dbEngine As New DAO.DBEngine
Dim accessDB As DAO.Database = dbEngine.OpenDatabase(accessPath)
Dim accessTable As DAO.Recordset = accessDB.OpenRecordset(tableName)
While _Reader.Read
accessTable.AddNew()
For i = 0 To _Reader.FieldCount - 1
accessTable.Fields(i).Value = _Reader.Item(i).ToString
Next
accessTable.Update()
End While
其他一些注意事项:
- 在所有示例中,所有内容都转换为字符串,以尽量保持简单和一致
- 例外:在我的第一个示例中,使用 Table.Load 函数,我不这样做是因为......好吧,我真的不能,但是当我遍历阅读器并构建插入命令时,我做了基本相同的事情(即无论如何,它在做什么)。它没有帮助。
- 对于每个字段... Next vs. Field(i) vs. Field(name) 对我来说没有区别
- 我运行的每个测试都从一个新压缩的 Access 数据库中的空的预构建数据表开始
- 将数据读取器加载到内存中的数据表大约需要 3 秒
- 我认为封送数据不是问题,因为 Marc 的帖子表明通过自动化加载文本文件的速度与 DAO 一样快——如果有的话,它不应该在使用 ODBC/OleDB 时封送数据,但应该使用自动化时
- 所有这些都让我感到不安,因为它没有意义
希望有人能够对此有所了解……这很奇怪。提前致谢!