關與 transation 包法 |
答題得分者是:timhuang
|
QOO10
初階會員 發表:59 回覆:89 積分:29 註冊:2002-12-25 發送簡訊給我 |
請教各位前輩!!如下: 三個 table post a 之前必須先 post b ,
post b之前必須 post c 所以我目前的作法是如下: 在 a 與 b 之 onbeforepost 寫入如下 code ,但問題若 b.post
若真我要如何嚷 a 結束 post 並直行 aposterror?? procedure dm1.abeforepost
begin
try
b.post
except
showmessage('b post error');
end;
end; procedure dm1bbeforepost
begin
try
c.post
execpt
showmessage('c post error')
end;
end;
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
QOO10
初階會員 發表:59 回覆:89 積分:29 註冊:2002-12-25 發送簡訊給我 |
引言: 建議你可以在這三個 TTable 所連的 TDatabase 元件上起 Trasaction, 程式碼如下:謝謝您但如此 程式會將 table1 之流程走完而到 table1 之 afterpost 所以 table1 之修改將會存入try database1.StartTransaction; table1.Post; table2.Post; table3.Post; database1.Commit; except database1.Rollback; end; |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
一般來說, transaction 的包裝應由 database 端來實現,
若是由 ap 本身來進行的話, 除是是資料庫不支援, 否則要
考慮的點太多而不易實作!! 就您前面所提的方式, 若要自行維護該 transaction 的話, 可以
在 beforepost 中使用 abort , 將程式改寫如下:
procedure dm1.abeforepost begin try b.post; except //showmessage('b post error'); a.abort; end; end; procedure dm1bbeforepost begin try c.post; execpt //showmessage('c post error'); b.abort; end; end; |
QOO10
初階會員 發表:59 回覆:89 積分:29 註冊:2002-12-25 發送簡訊給我 |
引言: 一般來說, transaction 的包裝應由 database 端來實現, 若是由 ap 本身來進行的話, 除是是資料庫不支援, 否則要 考慮的點太多而不易實作!! 就您前面所提的方式, 若要自行維護該 transaction 的話, 可以 在 beforepost 中使用 abort , 將程式改寫如下:謝謝 timhuang 前輩,我是否可在 abort 後或前結束此 dataset 之 inser or edit 成 browse ,要如何做到,真的 Transation 在 ap 做真的蠻累的procedure dm1.abeforepost begin try b.post; except //showmessage('b post error'); a.abort; end; end; procedure dm1bbeforepost begin try c.post; execpt //showmessage('c post error'); b.abort; end; end; |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
QOO10
初階會員 發表:59 回覆:89 積分:29 註冊:2002-12-25 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
CANCEL 必須是在 dsEdit 下使用.
但是你的 dataset 可能已經回到了 dsBrowse 的狀態,
所以沒有辦法使用 cancel!!
其實 revertrecord 的原碼你可以追一下, 他也是會利
用 cancel, 如下:
procedure TBDEDataSet.RevertRecord; var Status: DBIResult; begin if State in dsEditModes then Cancel; Status := ProcessUpdates(dbiDelayedUpdCancelCurrent); if not ((Status = DBIERR_NONE) or (Status = DBIERR_NOTSUPPORTED)) then Check(Status); Resync([]); end; |
QOO10
初階會員 發表:59 回覆:89 積分:29 註冊:2002-12-25 發送簡訊給我 |
引言: CANCEL 必須是在 dsEdit 下使用. 但是你的 dataset 可能已經回到了 dsBrowse 的狀態, 所以沒有辦法使用 cancel!! 其實 revertrecord 的原碼你可以追一下, 他也是會利 用 cancel, 如下:謝謝您!!procedure TBDEDataSet.RevertRecord; var Status: DBIResult; begin if State in dsEditModes then Cancel; Status := ProcessUpdates(dbiDelayedUpdCancelCurrent); if not ((Status = DBIERR_NONE) or (Status = DBIERR_NOTSUPPORTED)) then Check(Status); Resync([]); end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |