4

1つのデータベーステーブルからデータをロードし、多くの操作と計算を行い、最終的に宛先テーブルにレコードを書き込む古いDelphi7アプリケーションがあります。

この古いアプリケーションは、パフォーマンス上の理由から、500レコードごとにApplyUpdatesを呼び出します。

問題は、この一連のレコードに、データベースの制約をトリガーするレコードが存在する場合があることです。Delphiは、ApplyUpdatesで例外を発生させます

私の問題は、どのレコードがこの例外の原因であるかわからないことです。500人の候補者がいます!

問題のあるレコードであるTClientDatasetに問い合わせることは可能ですか?

速度の問題のために、追加されたレコードごとにUpdatesを適用したくありません。

4

2 に答える 2

8

OnReconcileErrorデータセットに適用できなかったレコードごとに1回発生するイベントを実装してみてください。したがって、次のコードを試してみます。raSkipつまり、現在のレコードをスキップします。

procedure TForm1.ClientDataSet1ReconcileError(DataSet: TCustomClientDataSet;
  E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
  Action := raSkip;
  ShowMessage('The record with ID = ' + DataSet.FieldByName('ID').AsString +
    ' couldn''t be updated!' + sLineBreak + E.Context);
end;

ただし、これまで試したことはなく、関数によって発生したエラーを無視するのに遅すぎるかどうかはわかりませんApplyUpdates。言及するのを忘れて、DataSet更新できなかったレコードを含むべき渡されたパラメーターを使用してみてください。これは、問題の原因となったレコードを特定する方法である可能性があります。

またhere、ワークフローを適用する更新について説明します。

于 2012-04-10T15:06:51.457 に答える
2

実装OnReconcileErrorすると、例外の原因となっているレコードとデータにアクセスできるようになります。これを実現する簡単な方法は、「エラー調整ダイアログ」を追加することです。これは、[ファイル]|[新しいアイテム]で表示される[新しいアイテム]ダイアログにあります。新規| 他の。プロジェクトに追加し、clientdatasetのフォームで使用したら。次のコードは、それがどのように呼び出されるかを示しています。

procedure TForm1.ClientDataSetReconcileError(DataSet: TCustomClientDataSet;
  E: EReconcileError; UpdateKind: TUpdateKind;
  var Action: TReconcileAction);
begin
  Action := HandleReconcileError(DataSet, UpdateKind, E);
end;

例外ダイアログの代わりに表示されます。問題のあるデータを表示し、続行する方法を選択できます。最後に使ってから5年以上経ちますが、細かいところまで忘れていないことを願っています。

于 2012-04-10T16:14:29.497 に答える