2012-04-10 29 views
3

データベーステーブルからデータを読み込んで多数の演算と計算を行い、最後にレコードをデスティネーションテーブルに書き込む古いDelphi 7アプリケーションがあります。TClientDatasetデータベーステーブルの制約のためにApplyUpdatesエラーが発生しました

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

問題は、時には、データベースの制約を引き起こすレコードの束があることです。 Delphiは例外をApplyUpdatesで発生させます。

私の問題は私には分かりませんこのレコードの責任はです。候補者は500人です!

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

私はスピードの問題のために追加されたレコードをforeupに更新したくありません。

+0

最高の方法は、500レコードの例外を除いてのみforeachを更新することです。 – philnext

+0

@philnextあなたが何を意味するのか分かりません。 – Jako

+0

500件のレコードにApplyUpdatesがあります。次の500件の場合はそれを行います。例外が発生するまで500件のレコードごとにApplyUpdatesを適用して処理してください... – philnext

答えて

7

データセットに適用できなかったレコードごとに1回呼び出されるOnReconcileErrorイベントを実装しようとすると思います。だから私は、次のコードをしようと、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には、ワークフローを適用している更新が記載されています。

+0

しかし、['something'](http://docwiki.embarcadero.com/RADStudio/XE2/en/Applying_Updates)は、それがうまくいくかもしれないと私に伝えます。段落を参照してください[[ApplyUpdates'] http://docwiki.embarcadero.com/Libraries/ja/Datasnap.DBClient.TCustomClientDataSet.ApplyUpdates)を実行します。 – TLama

+0

私はテストされていないコードを拡張して、なぜその理由を説明するエラーと共に更新できなかったレコードに関する情報をメッセージに表示することができると思うかと思います。 – TLama

+0

これはそれだと思います! – Jako

2

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

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

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

+0

答えはTLamaに似ています。ありがとう私はupvotedしました – Jako

関連する問題