这是this thread的后续行为。这全是用.Net 2.0;至少对我来说。从本质上讲,马克(从上面的OP)尝试了几种不同的方法来更新一个有100000条记录的MS Access表,发现使用DAO连接大概是比使用ADO.Net快了10-30倍。我走下了几乎相同的路径(下面的例子),并得出了同样的结论。通过ADO.Net和COM互操作性的MS Access批量更新
我想我只是想了解为什么 OLEDB和ODBC是如此慢得多,我很想听听如果有人在2011年发现了比DAO一个更好的答案,因为这个职位,我真的很宁愿避免DAO和/或自动化,因为他们要求客户端机器具有Access或数据库引擎的可再分发(或者我被DAO 3.6支持,不支持.ACCDB)。
最初尝试; 〜100秒10万条记录/ 10列:
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)
无论如何,我认为这是非常奇怪的,所以我尝试同样的事情几种口味:
- 交换了OLEDB对ODBC
- 环流式通过数据表和运行的INSERT语句的每一行
- 这是.Update确实反正
- 使用ACE提供商代替射流(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函数,我不是因为......嗯,我真的不行,但是当我通过阅读器并构建插入命令(正是它在做什么)时,我做了基本相同的事情。它没有帮助。
- For Each Field ... Next vs. Field(i)vs.字段(名称)没有什么区别,我
- 每次我在刚压缩Access数据库
- 加载数据读取到数据表中的内存跑开始与空,预先建立数据表检验需要2-3秒
- 我不认为这是编组数据的问题,因为Marc的帖子指出通过Automation加载文本文件的速度与DAO一样快 - 如果有的话,在使用ODBC/OleDB时不应该封送数据,但它应该当使用自动化
- 所有这些困扰我的方式超过它应该,因为它没有意义
希望有人能够阐明这一点......这很奇怪。 在此先感谢!
感谢您的解释!我知道DAO直接坐落在数据库引擎上,我从来没有见过*只是使用一个额外的中间件层而导致性能急剧下降。在这种情况下,与其他DBMS相比,Access的主要目标是更新通常是否会批量运行更新,而不是通过ODBC传递每条记录? – Karter
命中**是因为它是Access。它不会像(火焰诱饵在这里)_real_ RDBMS一样糟糕,对于SQL Server(和SQL Server express),您也可以使用'SqlBulkCopy'类以接近表面融化速度插入行。如果可以的话,我会诚实地推荐MS Access并开始使用SQL Express运行。我广泛地在当天使用Access,并且从不喜欢它。 _“啧啧,我很高兴我使用了该项目的访问权限”,表示没有人曾经_ –
我不反对;但是,你知道,**遗产支持所有的事情** – Karter