- ベストアンサー
Sql Server 2005でデータ抜けについて
- クライアントからのデータ登録時に、Sql Server 2005で1電文目が更新できない現象が発生しています。以前はSql Server 7.0で同様のプログラムで問題なく更新できていました。
- クライアント側のプログラムやサーバ側のプロファイラを確認した結果、1電文目のデータは正しく残っており、2電文目以降は正常に更新されていることが分かりました。
- この現象について、対処方法や原因をご存知の方がいらっしゃいましたら、教えていただけないでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
違うみたいですね。 7.0と2005で違うところは、MDACぐらいでしょうか。 SQL Server2005 では、 Microsoft Data Access Components (MDAC) 2.8 SP1 以上が必要です。 参考URL: http://msdn2.microsoft.com/ja-jp/library/ms143506.aspx また、MDACのバージョン確認方法は、 http://support.microsoft.com/kb/301202 をみて、確認してみてもらえますか? もし、MDACが既定を満たしているようであれば、また別の原因です。 この手の問題は推測しながら、1つずつ潰していくしかないので 根気よくやっていくしかないと思います。 よろしくお願いします。
その他の回答 (3)
- kero_mio
- ベストアンサー率90% (94/104)
状況は理解できました。 気になった点として、ローカルDB BeginTransaction です。 ローカルDBの方は、SELECTしかしていないので、 トランザクションを発行しなくても良いのかなと思います。 ローカルDBに対するBeginTransaction と commit transaction(やっているのであれば) をやめたらどうなりますか? また、上記とは別で、3件Commitではなく、1件Commitにした場合、どうなりますか? いろいろとお手数をおかけしますが、ご確認よろしくお願いします。
補足
お世話になります。 先日記述しましたロジックにぬけがございまして、ローカルも更新しております。 サーバ側更新と同じタイミングで行っています。二重送信しないようにフラグを立てております。 サーバ側のコミットの件ですが、一件でも駄目でした。 Sqlserverのバージョンにより、このような現象が発生するものなのでしょうか。 大変、混乱させて申し訳ございませんが、よろしくお願いします。
- kero_mio
- ベストアンサー率90% (94/104)
>トランザクション単位は、VBでコントロールしておりまして、3レコードごとです。 >また、ためしに、SQLをEXCUTEするロジックを2行にすると、Insertされています。(単純に、VB側でEXCUTEコマンドをコピーし、次の行に貼り付けしただけです。) すいません、私の言い方が悪かったみたいなので、言い方を 変えます。 ある程度のレコード件数によって、トランザクションの単位が 決められているということで宜しいでしょうか? また、EXECUTEで呼び出しているのは、生のSQLですか? それとも何かストアドを作って、それを実行してますか? できれば、VB側のソースと、あるのであれば、SQL Serverのストアドの ソースが公開できる範囲(まずい箇所は加工しても良いので)で どんなソースコードとテーブルレイアウトなのか、教えて 頂けますか?よろしくお願いします。
補足
お世話になります。 ソースの内容について、説明します。 なお、ローカルDBとサーバDBのレコードフォーマットは同一です。 VBの内容 ストアドを宣言する。 cmM.CommandText = "{? = call ストアド名(?,?,・・・・・)}" ローカルDB(MSDE)オープン サーバDB(Sqlserver2005)オープン ローカルDB BeginTransaction サーバDB BeginTransaction ローカルDBへSELECT分発行(条件(日付 及び、未送信データ)で抜き出す。) 以下を繰り返し。 SELECTした結果をストアドの引数に各項目をセット。 cmM.Executeを行い、サーバへ送信する。 ・・・・・(1) 3件送信毎に commit transaction begin transaction move next ここまでを繰り返す。 全データ送信したら、 Commit Transactionを発行する。 ローカル・サーバのデータベースを切断する。 ストアドの内容 ストアドの内容に対して、重複データが無いか存在チェックを行う。 存在した場合、 引数で渡された内容を使用して、Updateを行う。 存在しない場合、 引数の内容で、Insertする。 上記(1)の後に、(1)をコピーして貼り付けた状態(cmM.Executeを2行連続で発行)だと、ぬけは発生しません。(1)が1行の場合は、ぬけが発生します。 但し、2件目以降送信している内容は、(1)1回のみで正しく送信できております。 以上のような状況です。上記内容で分かりますでしょうか。 大変申し訳ございませんが、よろしくお願いします。
- kero_mio
- ベストアンサー率90% (94/104)
何か更新エラー等は発生しておりましたでしょうか? また、その更新用のSQLはどんなテーブルに対して、 どんなSQLを実行しているのか、 またVB側で制御しているトランザクションの単位などが わかれば、詳しく教えて頂けると助かります。 よろしくお願いします。
補足
ご回答ありがとうございます。 エラーは発生しておりません。 更新SQLについては、 insertしています。 トランザクション単位は、VBでコントロールしておりまして、3レコードごとです。 また、ためしに、SQLをEXCUTEするロジックを2行にすると、Insertされています。(単純に、VB側でEXCUTEコマンドをコピーし、次の行に貼り付けしただけです。)
お礼
大変お世話になります。 MDACを最新にアップグレードした結果、現時点で発生しなくなったようです。 今後、様子を見て行きたいと思います。 ありがとうございました。
補足
大変お世話になります。 MDACの確認は、現在行っておりますが、まだ完了しておりません。 大変申し訳ございませんが、後日ご連絡させてください。 よろしくお願いします。