電子書籍の厳選無料作品が豊富!

お世話になります。
クラサバを構築しているのですが、クライアントよりデータをサーバに登録する際、VB6 SP4のアプリでバッチ処理を行っております。1電文目(サーバのストアドプロシジャを起動)のみ、サーバ(Sql Server 2005)に更新できません。2電文目からあとは、正しく更新されています。
以前は、クライアント側のプログラムは同じだった状態で、サーバのデータベースは、SqlServer 7.0で運用しておりました。その際は、全く問題なく更新できておりました。
また、SQLSERVER2005でサーバ側のプロファイラを使用すると、1電文目も正しく残っています。
このような現象・対処方法等ご存知の方はいらっしゃいませんでしょうか。
よろしくお願いします。

A 回答 (4件)

違うみたいですね。


7.0と2005で違うところは、MDACぐらいでしょうか。
SQL Server2005 では、
Microsoft Data Access Components (MDAC) 2.8 SP1 以上が必要です。

参考URL:
http://msdn2.microsoft.com/ja-jp/library/ms14350 …

また、MDACのバージョン確認方法は、
http://support.microsoft.com/kb/301202
をみて、確認してみてもらえますか?

もし、MDACが既定を満たしているようであれば、また別の原因です。
この手の問題は推測しながら、1つずつ潰していくしかないので
根気よくやっていくしかないと思います。

よろしくお願いします。

この回答への補足

大変お世話になります。

MDACの確認は、現在行っておりますが、まだ完了しておりません。
大変申し訳ございませんが、後日ご連絡させてください。
よろしくお願いします。

補足日時:2008/02/01 12:54
    • good
    • 0
この回答へのお礼

大変お世話になります。

MDACを最新にアップグレードした結果、現時点で発生しなくなったようです。
今後、様子を見て行きたいと思います。
ありがとうございました。

お礼日時:2008/04/07 10:19

状況は理解できました。


気になった点として、ローカルDB BeginTransaction です。
ローカルDBの方は、SELECTしかしていないので、
トランザクションを発行しなくても良いのかなと思います。
ローカルDBに対するBeginTransaction と commit transaction(やっているのであれば)
をやめたらどうなりますか?

また、上記とは別で、3件Commitではなく、1件Commitにした場合、どうなりますか?

いろいろとお手数をおかけしますが、ご確認よろしくお願いします。

この回答への補足

お世話になります。
先日記述しましたロジックにぬけがございまして、ローカルも更新しております。
サーバ側更新と同じタイミングで行っています。二重送信しないようにフラグを立てております。

サーバ側のコミットの件ですが、一件でも駄目でした。
Sqlserverのバージョンにより、このような現象が発生するものなのでしょうか。

大変、混乱させて申し訳ございませんが、よろしくお願いします。

補足日時:2008/01/28 18:47
    • good
    • 0

>トランザクション単位は、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回のみで正しく送信できております。

以上のような状況です。上記内容で分かりますでしょうか。
大変申し訳ございませんが、よろしくお願いします。

補足日時:2008/01/24 11:13
    • good
    • 0

何か更新エラー等は発生しておりましたでしょうか?


また、その更新用のSQLはどんなテーブルに対して、
どんなSQLを実行しているのか、
またVB側で制御しているトランザクションの単位などが
わかれば、詳しく教えて頂けると助かります。
よろしくお願いします。

この回答への補足

ご回答ありがとうございます。
エラーは発生しておりません。
更新SQLについては、
insertしています。
トランザクション単位は、VBでコントロールしておりまして、3レコードごとです。
また、ためしに、SQLをEXCUTEするロジックを2行にすると、Insertされています。(単純に、VB側でEXCUTEコマンドをコピーし、次の行に貼り付けしただけです。)

補足日時:2008/01/22 23:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す