データセット コンポーネント メソッドによるキャッシュ アップデートの適用
BDE を使用した更新情報のキャッシュ:インデックス への移動
メモ: BDE(Borland Database Engine)は非推奨になったため、今後は機能強化されません。 たとえば、BDE では Unicode はサポートされません。 BDE を使用した新規開発はしないことをお勧めします。 既存のデータベース アプリケーションを BDE から dbExpress に移行することを検討してください。
データセットの ApplyUpdates メソッドと CommitUpdates メソッドを使用して、個別の BDE 対応データセットに直接更新を適用することができます。これらのメソッドはどちらも更新プロセスの 1 つの段階をカプセル化します:
- ApplyUpdates は、キャッシュされた変更をデータベースに書き込みます(フェーズ 1)。
- CommitUpdates は、データベースの書き込みに成功した場合に、内部キャッシュをクリアします(フェーズ 2)。
次のコードは、CustomerQuery データセットについて、トランザクション内での更新の適用方法を示します:
fDelphi:
procedure TForm1.ApplyButtonClick(Sender: TObject)
begin
Database1.StartTransaction;
try
if not (Database1.IsSQLBased) and not (Database1.TransIsolation = tiDirtyRead) then
Database1.TransIsolation := tiDirtyRead;
CustomerQuery.ApplyUpdates; { try to write the updates to the database }
Database1.Commit; { on success, commit the changes }
except
Database1.Rollback; { on failure, undo any changes }
raise; { raise the exception again to prevent a call to CommitUpdates }
end;
CustomerQuery.CommitUpdates; { on success, clear the internal cache }
end;
C++:
void __fastcall TForm1::ApplyButtonClick(TObject *Sender)
{
Database1->StartTransaction();
try
{
if (!Database1->IsSQLBased && Database1->TransIsolation != tiDirtyRead)
Database1->TransIsolation = tiDirtyRead;
CustomerQuery->ApplyUpdates(); // try to write the updates to the database
Database1->Commit(); // on success, commit the changes
}
catch (...)
{
Database1->Rollback(); // on failure, undo any changes
throw; // throw the exception again to prevent a call to CommitUpdates
}
CustomerQuery->CommitUpdates(); // on success, clear the internal cache
}
例外が ApplyUpdates の呼び出しの間に発生した場合、データベース トランザクションはロール バックされます。トランザクションのロールバックでは、基礎となるデータベース テーブルは変更されません。try...except ブロックでの raise 文は例外を再生成するため、CommitUpdates の呼び出しが防止されます。CommitUpdates が呼び出されないため、更新の内部キャッシュはクリアされないので、エラー条件の処理と、場合により、場合により更新に再試行を行うことができます。