FireDACのデータセットでApplyUpdatesメソッドを実行すると、例外が捕捉できません。
問題
例えば、FireDACのデータセットでApplyUpdatesメソッドを実行し、重複したレコードを挿入しているのに例外エラーが発生せず、exceptで捕捉できません。 何故でしょうか?
Delphiのコード例:
FDConnection1.StartTransaction;
try
..
//ここで、重複したレコードを挿入する処理を実行
..
FDQuery1.ApplyUpdates;
FDConnection1.Commit;
except
ShowMessage('例外エラーが発生');
FDConnection1.RollBack;
abort;
end;
解決
FireDACのデータセットのApplyUpdatesメソッドは、例外は発生しません。 その代わりに、発生した例外エラーの数を返します。 そのため、try~catchで例外を補足するのではなく、例外エラーの数で判断し、コミット/ロールバックどちらを実行するか決めましょう。
簡単なコード例は、以下の通りです。
Delphi:
var
ErrorCount: Integer;
begin
FDConnection1.StartTransaction;
ErrorCount := FDQuery1.ApplyUpdates(-1);
if ErrorCount = 0 then
FDConnection1.Commit //エラーが無ければコミット
else
FDConnection1.Rollback; //エラーがあれば、ロールバック
end;
C++Builder:
FDConnection1->StartTransaction();
int ErrorCount=FDQuery1->ApplyUpdates(-1);
if( ErrorCount==0 ){
FDConnection1->Commit(); //エラーが無ければコミット
}else{
FDConnection1->Rollback(); //エラーがあればロールバック
}