關於ClientDataSet的存取OldValue,CurValue,NewValue的問題 |
答題得分者是:ccchen
|
chinliang
一般會員 發表:16 回覆:26 積分:13 註冊:2002-06-17 發送簡訊給我 |
關於ClientDataSet的存取OldValue,CurValue,NewValue的問題 小弟目前在寫多人存取資料庫,所可能發生對同一筆記錄作刪除及修改的問題
的錯誤處理,小弟的問題是若使用TQuery元件即無法存取CurValue,但是使用
Table即可,但是想請教是否有方法可以使TQuery可存取CurValue,當發生錯
誤時,使用TTable元件的會產生"Record not found or changed by another
user",接著會開啟我寫的ReconcileError Dialog,但使用TQuery時尚
出"Unable to find record. No key specified."的錯誤,就無法抓出
CurValue,小弟想是不是TQuery要指定KEY值,但要如何指定?敘述如下,望請
各位先進不吝指教,謝謝。 錯誤處理作法: 在ClientDataSet1的OnReconcileError內寫入錯誤處理程序如
下:
Action:= HandleReconcileError(DataSet, UpdateKind, E); 並開啟一ReconcileError Dialog,顯示三個欄位為:
1. New Value : 欲輸入資料庫的值
2. Conflict Value: 衝突的值,意即為CurValue,為其他使用
者已寫入資料庫的值
3. Old Value: 原始下載至Client端的值 連接方式1(使用TABLE元件):可成功執行 Database1 --> Table1 --> DataSetProvider1 --> ClientDataSet1 連接方式2(使用TQUERY元件):無法抓出CurValue值 Database1 --> TQuery1 --> DataSetProvider1 --> ClientDataSet1
範例如下: ===================================== 欄位名稱: ID PW Dep ================= 原始資料: Mary 123 MIS =====================================操作流程: 1. 使用者A改成: Mary 456 ACC 2. 使用者B改成: Mary 789 CUS 但產生ReconcileError事件, 因被使 用者A修改過了,隨即顯示ReconcileError Dialog,抓出如下值: 欄位名稱 New Value Conflict Value(CurValue) Old Value ========================================================= ID Mary Mary Mary PW 789 456 123 Dep CUS ACC MIS簡而言之,就是上面的Conflict Value如果使用TQuery,根本沒辦法抓出,不知 各位先進是否有解決辦法? 註: 除了無法抓出CurValue外,當然也沒有辦法依照使用者所選的的Reconcile 方式(如: raCorrect,raMerage)來作處理。 謝謝你花時間看完,也請了解的先進不吝指教,再次謝謝。 |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
chinliang
一般會員 發表:16 回覆:26 積分:13 註冊:2002-06-17 發送簡訊給我 |
對不起,因這一二天在忙其他的事,故比較晚回覆,再次感謝熱
心的版主先進,上次也是問了一個關於DBGrid顯示MEMO欄位的問
題,也是版主幫忙,真是銘感五內。 依照版主所指示,設定完後果然是可以的,查了一下HELP才了解
UpdateMode屬性的意義為"Controls how the provider locates
records when applying updates",倘若是在沒有人在使用者之
前變更的話,設UpdateWhereAll是不會有問題的,在Query內,把
欄位的providerFlag內的pInkey的屬性設為True即設定Key值,不
知是否觀念正確? 但是想到一個問題想請教版主,今天在發生使用者重複對一記錄
作修改及其他動作時,若發現有被其他使用者修改的話,理應秀
出ReconcileError Dialog讓使用者知道別人已經對此記錄作了異
動,但是在使用上述方法下,並無法像使用TTable元件,觸發Clien
tDataSet內的OnReconcileError事件,於是我想了一個方法,一開
始都不按照版主的設定,在第二個使用者重複編輯同一記錄,在
Client端呼叫ClientDataSet的ApplyUpdates時,因為找不到該記錄
,故觸發了DataSetProvider的OnUpdateError,然後在這裡動態的設
定UpdateMode為upWhereKeyOnly,動態的指定Key值,然後便會觸發
ClientDataSet的OnReconcileError事件,跳出預先設計好的Reconcile
Error Dialog,讓使用者知道這個記錄已經被修改過,然後再決定
如何處理,不知這樣的作法是正確的嗎,還是會有什麼問題?若沒有
問題的話,這幾天就想要照這個方法給他做下去了。 也請各位先進能指導一下,如何做好錯誤處理,因為以前寫程式都
不太注意錯誤的處理,所以並沒有很強的概念,謝謝。
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
chinliang
一般會員 發表:16 回覆:26 積分:13 註冊:2002-06-17 發送簡訊給我 |
|
legon
一般會員 發表:1 回覆:13 積分:2 註冊:2002-09-27 發送簡訊給我 |
|
chinliang
一般會員 發表:16 回覆:26 積分:13 註冊:2002-06-17 發送簡訊給我 |
|
sundy6719
初階會員 發表:136 回覆:78 積分:42 註冊:2002-07-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |