【发布时间】:2011-10-25 16:36:59
【问题描述】:
我有一个使用 adodb 记录集和 Microsoft Access 2007 数据库文件的 VB6 程序;我向应用程序添加了获取表中每条记录的代码,对于表中的大多数记录,我获取一个字段,根据该字段中的值计算一个新值,并将该值存储在同一记录中的另一个字段中.我对此进行了测试并将其投入生产;它在大量笔记本电脑上运行时没有(报告)错误。
我今天收到一个错误报告;据我所知,记录集上的 updateBatch 方法存储的值与我放在那里的值略有不同,当然也不同于我打算放在那里的值。我已将其放入调试器并验证新值是我想要的值;我已经放入了将基本值和新值写入文件的语句,并验证了 THOSE 是我想要的,但不同的值最终会出现在数据库中。
这是相关的循环:
sqlStr = "Select key_citation, long_citeIndex from citation"
Set rs = m_dbh.runSQLReturnRS_RW(sqlStr)
While Not rs.EOF
citationNumber = rs.Fields("key_citation").value
If Left$(citationNumber, 1) <> "W" Then
newIndex = Citation.calculateCiteIndex(citationNumber)
Open "c:\CitationIndexDebug.txt" For Append As #4
Write #4, citationNumber, newIndex
Close #4
rs.Fields("long_citeIndex").value = newIndex
End If
rs.MoveNext
Wend
rs.UpdateBatch
rs.Close
Set rs = Nothing
runSQL 等使用 adOpenDynamic、adLockBatchOptimistic 打开记录集
我尝试为每条记录添加 rs.Update,但这似乎根本不起作用;我假设,因为应用程序的其余部分使用 updateBatch,runSQL 语句会打开记录集并假设批量更新。
有人知道为什么这是错误的,而且只有一小部分时间是错误的吗?正如我所说,它在数十/数百台机器上运行正常,然后在这个特定的数据库上出现错误。
【问题讨论】:
-
您能否在您的开发环境中始终如一地重现该问题?如果是这样,我建议在正在更新的数据库上运行 SQL 分析器,以便您可以看到 ADODB 正在生成哪些 SQL 命令。
-
是的,我可以反复出现这个问题。我不熟悉 SQL 探查器;你能指出一些可以告诉我如何运行它的东西吗?这是一个 MS Access 数据库,严格来说是桌面;我有 MS Access,但根本没有运行 SQL Server。谢谢!
-
糟糕,对不起!我看到你放了 Access,但由于某种原因,我只是假设 SQL Server。那我的评论对你没有多大用处。请查看此问题/答案,了解可能对您有用的类似内容:stackoverflow.com/questions/2735412/…
-
好吧,我已经找到了部分答案。该循环旨在跳过基本字符串中第一个字符为“W”的记录;这个数据库有 7 条这样的记录。我编写了跟踪代码来告诉我这些事情的处理顺序,并发现计算的值偏离了 6 条记录。看来 moveNext 将用于计算的记录移动了一个,但是在存储计算值时,它将它们存储在我没有写入的最后一条记录中。如果有人对此有任何见解,我很想听听。