2011-10-25 63 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