データセットコンポーネントメソッドによるキャッシュアップデートの適用
BDE を使用した更新情報のキャッシュ:インデックス への移動
メモ: ボーランド データベース エンジン(BDE)は推奨されなくなったので、今後は機能強化されません。たとえば、BDE では Unicode はサポートされません。BDE を使用して新規に開発を始めないでください。既存のデータベース アプリケーションを BDE から dbExpress に移行することを検討してください。
データセットの ApplyUpdates メソッドと CommitUpdates メソッドを使用して、個別の BDE 対応データセットに直接更新を適用します。これらのメソッドはどちらも更新プロセスの 1 つの段階をカプセル化します。
- ApplyUpdates が、キャッシュに入っている変更をデータベースに書き込む(第 1 段階)
- CommitUpdates はデータベースの書き込みに成功した場合、内部キャッシュをクリアする(第 2 段階)
次のコードは、CustomerQuery データセットについて、トランザクション内での更新の適用のし方を示します。
procedure TForm1.ApplyButtonClick(Sender: TObject) begin Database1.StartTransaction; try if not (Database1.IsSQLBased) and not (Database1.TransIsolation = tiDirtyRead) then Database1.TransIsolation := tiDirtyRead; CustomerQuery.ApplyUpdates; { 更新のデータベースへの書き込みを試行する } Database1.Commit; { 成功したら、変更をコミットする } except Database1.Rollback; { 失敗したら、変更を元に戻す } raise; { CommitUpdates の呼び出しを防止するために例外を再生成する } end; CustomerQuery.CommitUpdates; { 成功したら、内部キャッシュをクリアする } end;
void __fastcall TForm1::ApplyButtonClick(TObject *Sender) { Database1->StartTransaction(); try { if (!Database1->IsSQLBased && Database1->TransIsolation != tiDirtyRead) Database1->TransIsolation = tiDirtyRead; CustomerQuery->ApplyUpdates(); // 更新のデータベースへの書き込みを試行する Database1->Commit(); // 成功したら、変更をコミットする } catch (...) { Database1->Rollback(); // 失敗したら、変更を元に戻す throw; // CommitUpdates の呼び出しを防止するために例外を再生成する } CustomerQuery->CommitUpdates(); // 成功したら、内部キャッシュをクリアする }
ApplyUpdates の呼び出し中に例外が生成された場合、データベーストランザクションはロールバックされます。トランザクションのロールバックでは、基礎になるデータベーステーブルは変更されません。try...except ブロック内部の raise 文は例外を再生成するので、CommitUpdates の呼び出しは防止されます。CommitUpdates が呼び出されないため、エラー条件の処理と可能であれば更新の再試行ができるように更新の内部キャッシュはクリアされません。