Vb6 adodb updateBatch存储不正确的信息
我有一个VB6程序,使用adodb记录集和MicrosoftAccess2007数据库文件;我向应用程序中添加了代码,用于获取表中的每条记录,对于表中的大多数记录,我获取一个字段,根据该字段中的值计算一个新值,并将该值存储在同一记录中的另一个字段中。我对此进行了测试并投入生产;它正在大量笔记本电脑上运行,没有报告错误 我今天报告了一个错误;据我所知,记录集上的updateBatch方法存储的值与我放在那里的值略有不同,当然与我打算放在那里的值不同。我已将其放入调试器中,并验证新值是否为我想要的值;我已经输入语句,将基值和新值写入一个文件,并验证这些是我想要的,但不同的值最终会出现在数据库中 以下是相关循环:Vb6 adodb updateBatch存储不正确的信息,vb6,adodb,Vb6,Adodb,我有一个VB6程序,使用adodb记录集和MicrosoftAccess2007数据库文件;我向应用程序中添加了代码,用于获取表中的每条记录,对于表中的大多数记录,我获取一个字段,根据该字段中的值计算一个新值,并将该值存储在同一记录中的另一个字段中。我对此进行了测试并投入生产;它正在大量笔记本电脑上运行,没有报告错误 我今天报告了一个错误;据我所知,记录集上的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、ADLOCKBACHTOPTIME打开记录集
我试着为每一张唱片加入rs.Update,但这似乎根本不起作用;我假设,由于应用程序的其余部分使用updateBatch,runSQL语句会打开记录集,并假设进行批更新
有没有人知道为什么这是错误的,而且错误率很小?正如我所说,它在几十台/数百台机器上运行正常,然后在这个特定的数据库上出现错误。该值与您打算保存的值有什么不同?您能否提供一些示例,说明它应该是什么以及它实际保存为什么?作为替代方法,您可以仅使用ADOPENFORWARD检索记录集,然后发送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
您能否在开发环境中始终如一地重现问题?如果是这样,我建议在正在更新的数据库上运行SQL profiler,这样您就可以看到ADODB正在生成哪些SQL命令。是的,我可以重复产生问题。我不熟悉SQL分析器;你能给我指一些能告诉我如何运行它的东西吗?这是一个MS Access数据库,严格意义上是桌面;我有MS Access,但根本没有运行SQL Server。谢谢哎呀,对不起!我看到您放置了Access,但出于某种原因,我只是假设使用SQL server。我的评论对你没有多大用处。看看这个问题/答案,看看是否有类似的东西可能对你有用:好吧,我已经找到了部分答案。循环用于跳过基字符串中第一个字符为W的记录;这个数据库有7个这样的记录。我编写了跟踪代码来告诉我这些东西的处理顺序,并发现计算值偏离了6条记录。moveNext似乎将用于计算的记录按1移动,但在存储计算值时,它将它们存储在我没有写入的最后一条记录中。如果有人对此有任何见解,我很想听听。我有一个包含6位数字和E的7个字符字符串的字段。我正在计算一个由1、E在字段中的位置,然后按原始顺序计算6位数字组成的数字。6866E40应该会产生15686640,而calc例程会正确地执行此操作,但存储的是16886621。因此,当您测试此特定字段时,您可以单步查看代码,看到它正在将long_citeIndex字段设置为正确的值,但数据库显示的值是错误的?你需要做什么特殊的事情来重现这个问题吗?另外,如果使用adOpenKeyset或adOpenStatic,它是否也有同样的问题?我这样问是因为这里的文档说明应该使用它们。我复制了运行SQL的例程,将副本修改为使用adOpenStatic,并使用相同的结果重新运行了测试。是的,我可以单步执行代码,但此表中有1700条记录,我不想单步执行所有记录。我编写了代码,将每一个的基数和计算数写入一个文件,它们与预期的一样。因此,当它们在数据库中被计算时是正确的,而在数据库中是错误的。如果在循环中从使用UpdateBatch命令切换到使用Update,会发生什么?