いつも世話になっております、きょうこです。
DBテーブルにデータを登録する処理を行っています。
接続はODBC(3.51.01)で DBはMySQL(4.0.27)、Delphi6(pro)です。
データの登録はinsert文で、結合などはありません。
ExecSQLを実行する前に、実際のSQL文をログとして時間とともにCSVに出力しています。
先日、不思議な現象が出てしまい、調査しています。
下記の流れのプログラムで売上1と売上2の登録処理をしたのですが、
実際の売上が両方とも登録されていないという現象が発生しました。
SQL文はCSVに出力しているので、それを調査すると、
売上1,2とも出力されており、中略の部分も最後まで登録が完了されている様に見えます。
出力されていたSQL文を直接DBに接続し、コピーして流すと、登録されます。
SQL文は実際にはExecSQLの前に出力されるので、
ExecSQLで正しく登録が出来ていないという事も考えられ、
エラーが出れば、try文で引っかかると思うのですが、出ていない様です。
エラーの出ないInsert文を実行して、登録されないという事はあるのでしょうか?
今まで、通信が切れたことによるキー違反や、登録テーブルが壊れた場合のエラーは
except文に飛び、エラーメッセージが表示されていたので、特に問題はありませんでした。
もしかしたら、DelphiではなくDBに何か問題があると考えられますでしょうか?
今のところ、再現はしていません。
try
with Query1 do
begin
//売上1
Close;
SQL.Clear;
SQL.Text := wsql1(Insert文);
try
WriteSaveData(wsql1);←流すSQL文CSVに書き出し関数
ExecSQL;
except
SQL.Clear;
SQL.Text := エラーSQL文をエラー用テーブルに登録するSQL;
ExecSQL;
Exit;
end;
//売上2
Close;
SQL.Clear;
SQL.Text := wsql2(Insert文);
try
WriteSaveData(wsql2);←流すSQL文CSVに書き出し関数
ExecSQL;
except
SQL.Clear;
SQL.Text := エラーSQL文をエラー用テーブルに登録するSQL;
ExecSQL;
Exit;
end;
中略・・・・他のテーブルへの登録処理や更新処理
end;
finally
CloseFile();
end;
TransactionをCommitしてもダメでしょうか?
編集 削除HOtaさん、ありがとうこざいます。
対策として、Commitの記述も入れます!!
再現ができないので、確認ができないのですが。。。
現在は、登録後にもう一度登録できたか確認するSQL文を追加しています。
ダメな場合は、再登録、さらにダメな場合は処理中止の方向です。