2011-10-25 61 views
0

我有一个VB6程序使用adodb记录集和Microsoft Access 2007数据库文件;我将代码添加到应用程序中,该程序将表中的每条记录取出,对于表中的大多数记录,我取一个字段,根据该字段中的值计算新值,并将该值存储在同一记录中的另一个字段中。我对此进行了测试并投入生产;它在大量笔记本电脑上运行时没有(报告)错误。adodb updateBatch存储不正确的信息

今天报错了;尽我所知,记录集上的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

您可以在开发环境中一致地重现问题吗?如果是这样,我会建议在正在更新的数据库上运行SQL事件探查器,以便您可以看到ADODB正在生成哪些SQL命令。 –

+0

是的,我可以反复产生问题。我不熟悉SQL分析器;你能指点一些能告诉我如何运行它的东西吗?这是一个MS Access数据库,严格来说是桌面型的;我有MS Access,但根本没有运行SQL Server。谢谢! – arcy

+0

哎呀,对不起!我看到你把Access,但由于某种原因,我只是假设SQL服务器。我的评论对你来说并没有多大用处。看看这个问题/答案类似的东西,但可能适合你:http://stackoverflow.com/questions/2735412/access-mdb-is-it-possible-to-monitor-and-log-actual-查询作出反对一个acc –

回答

0

该值与您打算保存的值略有不同?你能举几个例子说明它应该是什么以及它实际上保存的是什么?

+0

好吧,它会得到一些参与...... – arcy

+0

我有一个字段,包含6个数字和一个“E”的7个字符的字符串。我正在计算由“1”组成的数字,字段中“E”的位置,然后是原始顺序中的6位数字。6866E40应该导致15686640,并且calc例程正确地执行了这些操作,但是存储的内容是16886621. – arcy

+0

因此,当您测试此特定代码时,可以逐句通过代码,看到将long_citeIndex字段设置为正确的值,但然后数据库显示错误的值?你有没有做任何特别的事情来重现这个问题?另外,如果您使用adOpenKeyset或adOpenStatic,它是否也有相同的问题?我问,因为这里的文档:[链接](http://msdn.microsoft.com/en-us/library/windows/desktop/ms675283(v = vs.85).aspx)指出,他们应该使用。 – UnhandledExcepSean

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