2011-10-25 9 views
0

私は、adodbレコードセットとMicrosoft Access 2007データベースファイルを使用するVB6プログラムを持っています。私は、テーブル内の各レコードを取るコードをアプリケーションに追加しました。テーブルのほとんどのレコードでは、1つのフィールドを取り、そのフィールドの値に基づいて新しい値を計算し、その値を同じレコードの別のフィールドに格納します。私はこれをテストし、それを生産に入れました。多数のラップトップでエラーが報告されずに実行されています。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

問題を開発環境で一貫して再現できますか?もしそうなら、私はADODBによってどのSQLコマンドが生成されているかを見るために、更新中のデータベース上でSQLプロファイラを実行することをお勧めします。 –

+0

はい、問題は繰り返し発生する可能性があります。私はSQLプロファイラに慣れていません。私にそれをどのように実行するか教えてくれる何かを教えてもらえますか?これは厳密にデスクトップのMS Accessデータベースです。私はMS Accessを持っていますが、SQL Serverはまったく動作していません。ありがとう! – arcy

+0

おっと、申し訳ありません!私はあなたがアクセスを入れているのを見ましたが、何らかの理由で私はSQLサーバーを想定しました。私のコメントはあまり役に立たない。あなたのために働くかもしれない何かのためのこの質問/答えを見てみましょう:http://stackoverflow.com/questions/2735412/access-mdb-is-it-possible-to-monitor-and-log-actual-質問に対して作られた質問 –

答えて

0

どのように値を保存する予定と少し違いますか?あなたはそれが何であるべきか、それが実際に貯蓄されているもののいくつかの例を提供できますか?

+0

まあ、それは少し関わってくるでしょう... – arcy

+0

私は6桁と "E"を含む7文字の文字列でフィールドを持っています。私は "1"、フィールド内の "E"の位置、そして元の順序で6桁で構成される数字を計算しています。6866E40は15686640になり、calcルーチンは正しく実行されますが、格納されるのは16886621です。 – arcy

+0

この特定のテストでは、コードをステップ実行してlong_citeIndexフィールドを正しい値ですが、データベースが間違った値を示していますか?問題を再現するために特別なことをしなければなりませんでしたか?また、adOpenKeysetまたはadOpenStaticを使用する場合、同じ問題がありますか?私はここに書かれているので、[link](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 
関連する問題