線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2115
推到 Plurk!
推到 Facebook!

三層架構

答題得分者是:jieshu
huangbh57
一般會員


發表:28
回覆:21
積分:9
註冊:2004-10-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-15 13:15:52 IP:218.247.xxx.xxx 未訂閱
請問三層架構的客戶端兩個表保存時的事務保護如何寫
jieshu
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-15 14:00:49 IP:203.204.xxx.xxx 未訂閱
引言: 請問三層架構的客戶端兩個表保存時的事務保護如何寫
發問前請先尋找是否有相關的討論存在, 下面有一篇您參考看看 【問題】多層應用系統中進行多個資料表資料的異動 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-16 08:59:06 IP:218.247.xxx.xxx 未訂閱
我按照你所給出的網址的程序寫了一個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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-16 09:42:06 IP:203.204.xxx.xxx 未訂閱
引言: 我按照你所給出的網址的程序寫了一個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;
那應該是您沒有做出現錯誤時的處理, 以致此Function沒辦法抓到exception的關係, 也就是DataSetProvider的OnUpdateError要將錯誤訊息Raise出來, 這樣才抓的到exception, 事件範例碼如下: Raise Exception.Create(E.Message);
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
speedup
資深會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-16 10:21:50 IP:220.135.xxx.xxx 未訂閱
引言:
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;    
執行DataSetProvider1.ApplyUpdates(Input[0], 0, li_e);後即使發生 'Change by Another User' 該方法也不會舉發任何意外 因此可採以下兩種作法 1.你必需判斷ErrorCount的傳回值是否大於0,若是舉發例外 2.或者在DataSetProvider1與DataSetProvider2的OnUpdateError事件舉發例外 例如
  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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-17 09:43:32 IP:218.247.xxx.xxx 未訂閱
如有四個表需要新增或修改更新(事先不知哪個表要更新),但實際上只有兩個表的記錄作改變,客戶端已用數組處理deltaarray[0]:=clientdataset1.delta,deltaarray[1]:=clientdataset2.delta,這樣服務器端不知如何送遞可變類型deltaarray判斷更新
jieshu
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-17 10:10:07 IP:203.204.xxx.xxx 未訂閱
引言: 如有四個表需要新增或修改更新(事先不知哪個表要更新),但實際上只有兩個表的記錄作改變,客戶端已用數組處理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/
系統時間:2024-03-29 3:18:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!