更新エラーの調停

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

レコードの更新 への移動


更新プロセスで発生するエラーを処理できるイベントには次の 2 種類があります。

  • 更新プロセス中に、処理できない更新が見つかるたびに内部プロバイダは OnUpdateError イベントを発生させます。OnUpdateError イベントのハンドラで問題が解決された場合、このエラーは ApplyUpdates メソッドに渡された最大エラー数の考慮からは除外されます。このイベントは、内部プロバイダを使用するクライアント データセットの場合にのみ発生します。TClientDataSet を使用している場合は、プロバイダ コンポーネントの OnUpdateError イベントを代わりに使用できます。
  • 更新操作全体が完了したあと、クライアント データセットは、プロバイダがデータベース サーバーに適用できなかったレコードごとに Datasnap.DBClient.TClientDataSet.OnReconcileError イベントを発生させます。

OnReconcileError イベントまたは OnUpdateError イベントのハンドラは必ずコーディングしなければなりません。たとえ、適用できずに返されたレコードを破棄するだけであっても必要です。これら 2 つのイベントのイベント ハンドラは同じように動作します。これらのイベント ハンドラには以下のパラメータがあります。

DataSet: 適用できなかった更新レコードが含まれているクライアント データセット。このデータセットのメソッドを使用すると、問題のあるレコードに関する情報を取得したり、問題を解決するためにレコードを編集することができます。特に、現在のレコードにおけるフィールドの CurValueOldValueNewValue の各プロパティを使用して、更新時の問題の原因を突き止めなければなりません。ただし、現在のレコードを変更するどのようなクライアント データセット メソッドもイベント ハンドラで呼び出してはいけません。

E: 発生した問題を表すオブジェクト。この例外を使用すると、エラー メッセージを取り出したり、更新エラーの原因を特定することができます。

UpdateKind:エラーを発生させた更新の種類。UpdateKind の取り得る値は、ukModify(変更された既存のレコードを更新中に問題が発生)、ukInsert(新規レコードを挿入中に問題が発生)、ukDelete(既存のレコードを削除中に問題が発生)のいずれかです。

Action: イベント ハンドラの終了時に実行するアクションを指示する var パラメータ。イベント ハンドラでは、このパラメータは以下のいずれかに設定します。

  • rrSkip または raSkip(このレコードをスキップして、変更ログにそのまま残す)
  • rrAbort または raAbort(調停操作全体を停止する)
  • rrMerge または raMerge(失敗した変更内容をサーバー内の対応するレコードにマージする)。これは、クライアント データセットのレコードで変更されたフィールドに対する変更内容がサーバー レコードに含まれていない場合にのみ有効です。
  • rrApply または raCorrect(イベント ハンドラ内のレコードの値がすでに修正されていると見なして、変更ログ内の現在の更新内容をそのレコード値で置き換える)
  • rrIgnore(エラーを完全に無視する)。この可能性は OnUpdateError イベントのハンドラにのみ存在し、そのイベント ハンドラが更新を元のデータベース サーバーに適用する場合を対象にしています。あたかもプロバイダが更新を適用したかのように、更新されたレコードは変更ログから削除され、Data にマージされます。
  • raCancel(クライアント データセット側でこのレコードの変更内容を取り消して、元の値に戻す)。この可能性は OnReconcileError イベントのハンドラにのみ存在します。
  • raRefresh(現在のレコード値をサーバー側のレコードと一致するように更新する)。この可能性は OnReconcileError イベントのハンドラにのみ存在します。

以下のコードは OnReconcileError イベントのハンドラの例を示しています。ここでは、objrepos ディレクトリ内の RecError ユニットに定義されているエラー調停ダイアログを使用しています (このダイアログを使用するには、RecError を uses 句に追加します)。

procedure TForm1.ClientDataSetReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind, var Action TReconcileAction);
begin
  Action := HandleReconcileError(DataSet, UpdateKind, E);
end;
void __fastcall TForm1::ClientDataSetReconcileError(TCustomClientDataSet *DataSet,
    EReconcileError *E, TUpdateKind UpdateKind, TReconcileAction &Action)
{
  Action = HandleReconcileError(this, DataSet, UpdateKind, E);
}

関連項目