我知道VB6有点过时,但那是我继承的应用程序。
我必须根据访问表的数组结果进行更新。
数组包含double和要更新的记录的id。
问题在于有120,000条记录需要更新,但在测试中,只需要60秒就可以在374条记录上运行它。
这是我的更新代码
Dim oCon As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim string3 As String
oCon.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & App.Path &"\hhis.mdb;Pwd=/1245;"
oCon.BeginTrans
For i = 0 To maxnumberofrecords - 1
string3 = "UPDATE YourRatings SET yourRatings=" & YourTotalRatingsAll(i) & " Where thisID = " & thisID(i) & ";"
oRs.Open string3, oCon, adOpenStatic, adLockOptimistic
Next i
oCon.CommitTrans
oCon.Close
我根据我读过的其他一些文章添加了“CommitTrans”,但这似乎没有提高速度。
另一个问题是我将不得不运行另一个查询来排名最高(1)到最低(374)并再次更新数据库...虽然我可以对数组做一些事情来添加该列在同一时间。
这对我来说似乎很慢,特别是当其他人在14秒内提到200000条记录时。
我错过了什么吗? 从文本文件加载会更快吗?
提前感谢您的帮助。
玛
答案 0 :(得分:4)
使用Open
始终构建新的ResultSet
对象。尝试oCon.execute string3
,它只将SQL发送到您的数据库,而不会产生ResultSet开销。
确保您在thisID
上有索引。
也许您的Access数据库位于网络驱动器上。这可能会产生很大的性能影响。在当地尝试。
答案 1 :(得分:3)
为什么使用蹩脚的旧Access桌面ODBC驱动程序而不是Jet 4.0 OLEDB Provider?
为什么要打开Recordset来执行UPDATE而不是在Connection上调用Execute?
是否有任何理由无法打开数据库以进行独占访问以执行此操作?锁定开销几乎被消除,像“BeginTrans / CommitTrans”这样的“货物崇拜”技术失去了任何意义。
表格中的thisID
字段是否有索引?
请尽快移至魔术子弹.Net。你的程序会更慢,但我们不必阅读所有指责VB6的行为。
答案 2 :(得分:0)
只是要添加到Wumpz的答案,您可能只想尝试将查询直接添加到Access数据库并使用参数调用它。 This SO thread更多地谈论它。
参数比注射更稳定,更不易破解。