2010-05-12 36 views
1

我試圖使用ReconcileError事件來允許用戶更正特定記錄中發生的更新錯誤之後的數據。在TClientDataset的ReconcileError方法中處理多個記錄中的更新錯誤

例子:

我有一個字段和3條記錄的數據集,這個領域在數據庫中具有唯一性約束,那麼我換一個價值衝突,當它到達數據庫,然後我打電話的ApplyUpdates上數據集。

這將在提供程序中生成一個錯誤(違反唯一約束),並中止applyupdates進程,並在ReconcileError方法的Action var中返回raAbort。

在ReconcileError方法我tryied使用方法:

Action := HandleReconcileError(aDataSet, UpdateKind, E); 

**編輯**

調試和傾倒這是從服務器返回的DataSet的記錄後,我注意到,有2條記錄在這個數據集中,第一個是舊記錄,第二個是我對第一個記錄所做的所有更改。

我有點困惑,我會總是得到這個DataSet 2記錄?我認爲它應該只有一個帶有舊/新值的記錄。

謝謝。

回答

2

有點調試和閱讀後,我想通了以下內容:

  • 的OnReconcileError被每一個信息不能被applyied併爲每個創建數據記錄。
  • 此數據集有2個記錄,當UpdateKind是ukModify,一個記錄作爲usUnModified(原始記錄)和第二記錄作爲usModified(所有修改都在該第二記錄)
  • 當變化是ukInsert或ukDelete的DataSet只有一條記錄
  • 不應更改此數據集,因爲這只是創建的臨時數據集,因此您可以讀取數據
  • 協調對話框不能按預期工作,因爲它從不顯示正確的值的修改記錄(Delphi 2010 bug?)
0

傳遞給OnReconcileError或OnUpdateError的記錄是無法應用更新的記錄。按照D2007 help file(注意,這是一個幫助文件的鏈接,而不是一個網頁鏈接!) - 注意有關數據集參數的部分:

你應該總是編寫一個 OnReconcileError或的OnUpdateError 事件處理程序,即使只丟棄 返回的記錄不能被 應用。這兩個事件的事件處理程序以相同的方式工作。他們 包括以下參數:

數據集: 包含更新記錄的客戶端數據集,其中 無法應用。您可以使用此 數據集的方法獲取有關問題記錄的信息 ,並編輯 記錄以糾正任何 問題。特別是,您會希望 使用 當前記錄中字段的CurValue,OldValue和 NewValue屬性來確定 更新問題的原因。但是, 您不得調用任何客戶端數據集 更改您的事件處理程序中當前記錄 的方法。

+0

我很困惑,我的DataSet有2條記錄,所有新值都在第二條記錄中,而不是在字段的NewValue屬性中。 – 2010-05-12 19:38:51

+0

我不確定。不過,我想快速測試應該告訴你;只需在CDS中修改幾行不同的內容,然後使用ApplyUpdates並查看OnReconcileError或OnUpdateError中的內容。 – 2010-05-12 20:30:39

1

在dbExpress的你會發現TSQLConnection組件,在參數中的條目,Mars_Connection,它被設置爲默認情況下,將其設置爲和錯誤信息得以解決