2012-04-10 17 views
3

我有一箇舊的Delphi 7應用程序,從一個數據庫表中加載數據,進行許多操作和計算,並最終將記錄寫入目標表。TClientDataset ApplyUpdates錯誤,因爲數據庫表約束

這個舊的應用程序調用爲了性能的原因,每500條記錄應用更新

問題是,有時候,在這堆記錄中有一個會觸發數據庫約束; Delphi在ApplyUpdates上觸發例外。

我的問題是我不知道哪個記錄負責這個例外。有500名候選人!

是否有可能要求TClientDataset哪個是違規記錄?

我不想爲速度問題ApplyUpdates foreach追加記錄。

+0

可能是最好的方法是applyUpdates foreach只有在500條記錄的異常之後。 – philnext 2012-04-10 14:55:58

+0

@philnext我不明白你的意思。 – Jako 2012-04-10 20:18:24

+0

在500條記錄上ApplyUpdates,如果一切正常,請爲下一個500個記錄執行操作,如果有異常,則爲每個500條記錄ApplyUpdates,直到出現異常爲止,對待並繼續... – philnext 2012-04-11 09:09:26

回答

7

我認爲您可能會嘗試執行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/en/Datasnap.DBClient.TCustomClientDataSet.ApplyUpdates)。 – TLama 2012-04-10 15:15:16

+0

我已經擴展了我的未經測試的代碼,我認爲可能顯示帶有無法更新的記錄信息的消息以及描述原因的錯誤。 – TLama 2012-04-10 16:48:05

+0

我認爲這就是它!感謝您對文檔 – Jako 2012-04-10 20:15:53

2

實施OnReconcileError將使您能夠訪問負責異常的記錄和數據。一個容易完成的是添加一個「Reconcile Error Dialog」。它位於由File |顯示的「New Items」對話框中新增|其他。一旦你將它添加到你的項目中,並用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 2012-04-10 20:37:36