adodb updateBatch 存储不正确的信息

Posted

技术标签:

【中文标题】adodb updateBatch 存储不正确的信息【英文标题】:adodb updateBatch storing incorrect info 【发布时间】: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。那我的评论对你没有多大用处。请查看此问题/答案,了解可能对您有用的类似内容:***.com/questions/2735412/… 好吧,我已经找到了部分答案。该循环旨在跳过基本字符串中第一个字符为“W”的记录;这个数据库有 7 条这样的记录。我编写了跟踪代码来告诉我这些事情的处理顺序,并发现计算的值偏离了 6 条记录。看来 moveNext 将用于计算的记录移动了一个,但是在存储计算值时,它将它们存储在我没有写入的最后一条记录中。如果有人对此有任何见解,我很想听听。 【参考方案1】:

值与您打算保存的值有何不同?您能否提供一些示例,说明它应该是什么以及它实际保存为什么?

【讨论】:

我有一个包含 7 个字符的字符串的字段,其中包含 6 个数字和一个“E”。我正在计算一个由“1”、“E”在字段中的位置以及原始顺序的 6 位数字组成的数字。 6866E40 应该导致 15686640,并且 calc 例程正确地执行此操作,但存储的是 16886621。 所以,当你测试这个特定的时候,你可以单步调试代码,看看是把 long_citeIndex 字段设置为正确的值,但是数据库显示的值是错误的?您是否需要做任何特别的事情来重现问题?另外,如果您使用 adOpenKeyset 或 adOpenStatic 是否也有同样的问题?我问是因为这里的文档:link 声明应该使用它们。 我复制了运行 SQL 的例程,修改了副本以使用 adOpenStatic,然后重新运行测试,结果相同。 是的,我可以单步执行代码,但是此表中有 1700 条记录,我不想全部单步执行。我编写了代码以将每个基数和计算出的数字写入文件,并且它们与预期的一样。所以当他们在数据库中被计算和错误时,他们是正确的。 如果在循环中从使用 UpdateBatch 命令切换到使用 Update 会发生什么?【参考方案2】:

作为替代方法,您可以使用 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

【讨论】:

以上是关于adodb updateBatch 存储不正确的信息的主要内容,如果未能解决你的问题,请参考以下文章

ADODB.Parameters 错误 '800a0e7c' 参数对象定义不正确。提供的信息不一致或不完整

正确使用CurrentProject.Connection进行ADODB.Connection?

在 MS Access (VBA) 中使用 ADODB 将非 ASCII 插入 MySQL 数据库时出现“不正确的字符串值”,但重试有效

错误: ADODB.Command (0x800A0BB9) 参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突

找不到提供者。它可能没有正确安装:ADODB [重复]

怎样使用ADO中的UpdateBatch方法(200分)