全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1975
推到 Plurk!
推到 Facebook!

[問題]ClientDataSet - 離線後更新?

答題得分者是:speedup
feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-21 17:52:11 IP:61.231.xxx.xxx 未訂閱
您好: 我使用的架構 (MSSQL2000)-> (ADO DataSetProvider) -> (ClientDataSet) 目前使用的情況是在 AP 第一次啟動時,啟動DCOMConnection的資料庫連結,並且將資料寫到本地端的 data.cds 然後關閉DCOMCi=onnection資料庫連接,將 ClientDataSet的filename屬性設定成 data.cds後,讓使用者進行編輯。 當使用者對資料庫做修改,使用 ClientDataSet.ApplyUpdate 更新是沒有問題的。 但是,如果使用者在更新資料庫之後,沒有使用ApplyUpdate,而選擇直接關閉程式,那程式在再次執行時,會先將 data.cds 讀進來,然後判斷 changecount > 0 時,連接資料庫並進行更新時,卻發生沒有錯誤訊息產生,但是卻無法更新的情況,而AP端的 changecount 數值也不變。 監控SQL端的運作,傳遞的SQL看起來與沒關閉程式前就ApplyUpdate(資料更新正確)的情況是一樣的。 有高手知道怎麼一回事嗎? 謝謝。
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-22 08:58:45 IP:61.224.xxx.xxx 未訂閱
你有試著在ClientDataSet OnReconcileError 撰寫錯誤處理程式碼嗎 不然的話你是不會看到任何ReconcileError 混心雜欲 棄修身~唉
------
唉~
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-22 09:24:26 IP:203.204.xxx.xxx 未訂閱
引言: 監控SQL端的運作,傳遞的SQL看起來與沒關閉程式前就ApplyUpdate(資料更新正確)的情況是一樣的。
你是如何監控SQL端的運作,照道理講只要SQL已經下了,除非再下RollBack,否則資料應該會更新才對?
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-22 09:54:34 IP:61.231.xxx.xxx 未訂閱
我並沒有在 OnReconcileError 撰寫錯誤處理碼。 我觀察SQL的方式是使用MSSQL的profiler。當我的AP執行時或更新資料時,可以看到更新的SQL指令都很正常。但是真實資料庫就是不會更新(用Enterprise Manager觀察)。 不過問的時候忘了說,當時想更新的是一個View,之前發展Client/Server時,ADO Driver可以直接更新一個view裡的內容,所以不疑有他,直接抄用。發生無法更新的怪問題後,改成一個個Table處理就可以了。不過我覺得應該不是不能更新View問題。 不過改成直接update一個table之後又衍生了一些問題,如果說我想同時更新數個Table,如果某個失敗就全部失敗,如果採用我所說的架構 (MSSQL2000)-> (ADO DataSetProvider) -> (ClientDataSet) 我目前的想法,要不然就是把所有Table applyupdate 寫在一個 try 裡做處理,要不然就是在(ADO DataSetProvider)端的 ADOConnection 的 commit 裡寫程式。不過第一種方法,如果applyupdate了,還可以rollback嗎?第二種方法,在client如果是一個個table去更新,也意味著是一個個datasetprovide與相對應的ADOTable一個個要求ADOConnection 進行 commit ,這樣能做到所有table能rollback嗎? 另外如果再考慮複雜一些,在 client 與 COM (就是我的ADO DataSetProvider段) 中間,再加上一層 web services 關於 rollback 應該是更複雜,尤其是,如果在 applyupdate 有錯誤發生時,可以回應使用者有哪些資料跟上次抓下來是不一樣的,然後問他們是不是確定要更新,這樣的功能不知道應該如何處理,傷腦筋。 一下問這樣多問題,對不起,謝謝您的回應。
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-22 11:39:29 IP:61.224.xxx.xxx 未訂閱
引言: 不過問的時候忘了說,當時想更新的是一個View,之前發展Client/Server時,ADO Driver可以直接更新一個view裡的內容,所以不疑有他,直接抄用。發生無法更新的怪問題後,改成一個個Table處理就可以了。不過我覺得應該不是不能更新View問題。
(ADO DataSetProvider) 中的DataSetProvider的ResolveToDataSet必須設成True,Update Data才會透過ADODataSet更新回資料庫,否則DataSetProvider 會自行下SQL更新資料庫
引言: 在client如果是一個個table去更新,也意味著是一個個datasetprovide與相對應的ADOTable一個個要求ADOConnection 進行 commit ,這樣能做到所有table能rollback嗎?
不行做到交易,你必須要把所有要交易的Table放入在同一次呼叫ApplyUpdates中,分多次呼叫是無法做到交易控制的 (除非你採用DComConnection且Client呼叫前先啟用ITransactionXXX 環境...) 實際上你可採行下述方法 1.使用nest-table技術 2.自行定義介面方法 3.利用OwnerData傳遞其於表格 混心雜欲 棄修身~唉
------
唉~
feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-22 13:26:41 IP:61.231.xxx.xxx 未訂閱
原來是我忘了調整 ResolveToDataSet 的設定,謝謝您的提醒。 至於多個Table applyupdate 的問題,我想會在 COM (ADO DataProvider) 端就先將相關的Table join 在一起之後(也可能是SQL Server的一個view),再透過WebService傳給AP,AP更改之後,再傳給 Webservice -> COM ,接著在COM 的ADO上進行 applyupdate,我想這樣應該是可行吧。 但是還有一個問題,就是如何取得造成更新失敗的資料是哪幾筆呢? 如果不能知道的話,那使用者勢必無法進行資料修正(不知道哪裡錯了),除非我們忽略掉這些錯誤,直接更新。 再次謝謝您的協助。
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-22 14:06:17 IP:61.224.xxx.xxx 未訂閱
引言: 原來是我忘了調整 ResolveToDataSet 的設定,謝謝您的提醒。 至於多個Table applyupdate 的問題,我想會在 COM (ADO DataProvider) 端就先將相關的Table join 在一起之後(也可能是SQL Server的一個view),再透過WebService傳給AP,AP更改之後,再傳給 Webservice -> COM ,接著在COM 的ADO上進行 applyupdate,我想這樣應該是可行吧。
重點是Client端無法撰寫交易控制碼,因此你必須把要做交易控制的所有Table的異動資料包在一個單一的呼叫方法中 ,在ap端至於你要撰寫任何交易控制碼就隨你,大概要注意的是,DataSetProvider本身會幫你做交易控制,因此寫在DataSetProvider事件中的程式碼應該不需要作交易控制,若自己開的interface方法則需特別注意
引言: 但是還有一個問題,就是如何取得造成更新失敗的資料是哪幾筆呢? 如果不能知道的話,那使用者勢必無法進行資料修正(不知道哪裡錯了),除非我們忽略掉這些錯誤,直接更新。
呼叫ApplyUpdates後,若失敗會傳回Reconcile相關資料,處理方式可參考OnReconcileError Help
procedure TForm1.ClientDataSetReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind; var Action TReconcileAction);    begin
  Action := HandleReconcileError(DataSet, UpdateKind, E);
end;
 
HandleReconcileError是Delphi提供處理Reconcile的範例方法 你可以由Delphi環境File->New->Other->Dialogs->Reconcile Error Dialog自動取得範例 基本上在ap端若要傳回Reconcile 資料可呼叫DataSetProvider.Applyupdates即可 你可以參考http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41693 混心雜欲 棄修身~唉
------
唉~
系統時間:2024-04-27 6:56:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!