三層架構 |
答題得分者是:jieshu
|
huangbh57
一般會員 發表:28 回覆:21 積分:9 註冊:2004-10-11 發送簡訊給我 |
|
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 請問三層架構的客戶端兩個表保存時的事務保護如何寫發問前請先尋找是否有相關的討論存在, 下面有一篇您參考看看 【問題】多層應用系統中進行多個資料表資料的異動 http://delphi.ktop.com.tw/topic.php?topic_id=47996 <iFrame src="http://www.coss.com.tw/jieshu/sign.htm" width=400 height=105 scolling="NO" border="0"></iFrame> 震江系統(股)公司: http://www.coss.com.tw/ 捷舒軟體設計坊: http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
huangbh57
一般會員 發表:28 回覆:21 積分:9 註冊:2004-10-11 發送簡訊給我 |
我按照你所給出的網址的程序寫了一個ADO連接的事務程序,我測試無論表一或表二更新碰到記錄已被別人更改時,其中一個表已更新完成,但不能恢復兩個表原先的狀態,即出錯時不跳到except去行datamodule1.ADOConnection1.RollbackTrans; server
function Tserdata.DataSetProvider1DataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
var
li_e : Integer;
begin
datamodule1.ADOConnection1.BeginTrans;
try
DataSetProvider1.ApplyUpdates(Input[0], 0, li_e);
DataSetProvider2.ApplyUpdates(Input[1], 0, li_e);
datamodule1.ADOConnection1.CommitTrans;
except
datamodule1.ADOConnection1.RollbackTrans;
end; end;
|
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 我按照你所給出的網址的程序寫了一個ADO連接的事務程序,我測試無論表一或表二更新碰到記錄已被別人更改時,其中一個表已更新完成,但不能恢復兩個表原先的狀態,即出錯時不跳到except去行datamodule1.ADOConnection1.RollbackTrans;那應該是您沒有做出現錯誤時的處理, 以致此Function沒辦法抓到exception的關係, 也就是DataSetProvider的OnUpdateError要將錯誤訊息Raise出來, 這樣才抓的到exception, 事件範例碼如下: Raise Exception.Create(E.Message);server function Tserdata.DataSetProvider1DataRequest(Sender: TObject; Input: OleVariant): OleVariant; var li_e : Integer; begin datamodule1.ADOConnection1.BeginTrans; try DataSetProvider1.ApplyUpdates(Input[0], 0, li_e); DataSetProvider2.ApplyUpdates(Input[1], 0, li_e); datamodule1.ADOConnection1.CommitTrans; except datamodule1.ADOConnection1.RollbackTrans; end; end;
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言:執行DataSetProvider1.ApplyUpdates(Input[0], 0, li_e);後即使發生 'Change by Another User' 該方法也不會舉發任何意外 因此可採以下兩種作法 1.你必需判斷ErrorCount的傳回值是否大於0,若是舉發例外 2.或者在DataSetProvider1與DataSetProvider2的OnUpdateError事件舉發例外 例如datamodule1.ADOConnection1.RollbackTrans; server function Tserdata.DataSetProvider1DataRequest(Sender: TObject; Input: OleVariant): OleVariant; var li_e : Integer; begin datamodule1.ADOConnection1.BeginTrans; try DataSetProvider1.ApplyUpdates(Input[0], 0, li_e); DataSetProvider2.ApplyUpdates(Input[1], 0, li_e); datamodule1.ADOConnection1.CommitTrans; except datamodule1.ADOConnection1.RollbackTrans; end; end; datamodule1.ADOConnection1.BeginTrans; try DataSetProvider1.ApplyUpdates(Input[0], 0, li_e); if li_e > 0 then raise Exception.Create('Update table 1 Error'); DataSetProvider2.ApplyUpdates(Input[1], 0, li_e); if li_e > 0 then raise Exception.Create('Update teble 2 Error'); datamodule1.ADOConnection1.CommitTrans; except datamodule1.ADOConnection1.RollbackTrans; end;另外如果你更新的兩個Table如果是Master/Detail架構且不考慮效率的話,那我會建議你採用MIDAS本身的Nest Table 架構(把表身包成表頭的一個欄位) 混心雜欲 棄修身~唉
------
唉~ |
huangbh57
一般會員 發表:28 回覆:21 積分:9 註冊:2004-10-11 發送簡訊給我 |
|
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 如有四個表需要新增或修改更新(事先不知哪個表要更新),但實際上只有兩個表的記錄作改變,客戶端已用數組處理deltaarray[0]:=clientdataset1.delta,deltaarray[1]:=clientdataset2.delta,這樣服務器端不知如何送遞可變類型deltaarray判斷更新忘了告訴您, 發問時要將主題寫明白, 只寫三層架構這樣是看不出問題的, 以後在搜尋時, 會造成某些的不便, 以後會直接扣分和刪除, 還有不同主題請另開主題發問(一樣是以後在搜尋時, 會造成某些的不便). 看您是要在前端判斷過濾還是後端, 最好連ProviderName也傳進去, 使用二維陣列, 在後端只要用ProviderName去搜尋元件來下ApplyUpdates, 這樣就可以達到共用的目的. <iFrame src="http://www.coss.com.tw/jieshu/sign.htm" width=400 height=105 scolling="NO" border="0"></iFrame> 震江系統(股)公司: http://www.coss.com.tw/ 捷舒軟體設計坊: http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |