我有一个使用adodb记录集的VB6程序和一个Microsoft Access 2007数据库文件;我在应用程序中添加了代码,用于获取表中的每条记录,对于表中的大多数记录,我获取一个字段,根据该字段中的值计算新值,并将该值存储在同一记录中的另一个字段中。我对此进行了测试并将其投入生产;它在大量笔记本电脑上运行时没有(报告)错误。
我今天报错了;就像我所知道的那样,记录集上的updateBatch方法存储的值与我放在那里的值略有不同,肯定不同于我想放在那里的值。我把它放在调试器中并验证新值是我想要的值;我已经放入了将基值和新值写入文件的语句,并验证了这是我想要的,但不同的值最终会出现在数据库中。
以下是相关循环:
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语句打开记录集,假定批量更新。
任何人都有任何想法,为什么这会出错,而错误的只有一小部分时间?正如我所说的那样,它在几十台/几百台机器上运行正常,然后在这个特定的数据库上出错。
答案 0 :(得分:0)
价值与您打算保存的价值略有不同?你能举几个例子说明它应该是什么以及实际存储的内容是什么?
答案 1 :(得分:0)
作为替代方法,您可以使用adOpenForwardOnly检索记录集,然后发送UPDATE SQL语句。我发明了 m_conn ,但它应该是一个ADO.Connection对象。
sqlStr = "SELECT key_citation FROM citation"
Set rs = m_conn.Execute(sqlStr, , adCmdText Or adOpenForwardOnly)
While Not rs.EOF
citationNumber = rs.Fields(0).Value
If Left$(citationNumber, 1) <> "W" Then
newIndex = Citation.calculateCiteIndex(citationNumber)
m_conn.Execute "UPDATE citation SET long_citeIndex = " & CStr(newIndex) & " WHERE key_citation = " & CStr(citationNumber), , adCmdText
End If
rs.MoveNext
Wend rs.UpdateBatch
rs.Close
Set rs = Nothing