データセット コンポーネント メソッドによるキャッシュ アップデートの適用

提供: RAD Studio
移動先: 案内検索

BDE を使用した更新情報のキャッシュ:インデックス への移動


メモ: BDE(Borland Database Engine)は非推奨になったため、今後は機能強化されません。 たとえば、BDE では Unicode はサポートされません。 BDE を使用した新規開発はしないことをお勧めします。 既存のデータベース アプリケーションを BDE から dbExpress に移行することを検討してください。

データセットの ApplyUpdates メソッドと CommitUpdates メソッドを使用して、個別の BDE 対応データセットに直接更新を適用することができます。これらのメソッドはどちらも更新プロセスの 1 つの段階をカプセル化します:

  1. ApplyUpdates は、キャッシュされた変更をデータベースに書き込みます(フェーズ 1)。
  2. 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 が呼び出されないため、更新の内部キャッシュはクリアされないので、エラー条件の処理と、場合により、場合により更新に再試行を行うことができます。

関連項目