dbExpress交易有問題? |
答題得分者是:Mickey
|
wb3599
一般會員 發表:32 回覆:32 積分:12 註冊:2004-02-11 發送簡訊給我 |
請教大家:
我參考李維大師的"Delphi 7 高效率程式一書" Page 2-28的範例實作, 有問題, 不知道要怎麼辦?我的環境是Delphi 7 dbExpress MS SQL 2000, 難道同樣的語法, 從Interbase換成MS SQL就不行嗎? 程式假設如下(只列重點):
...
scnnDemo.StartTransaction(aTD);
try
cdsA.ApplyUpdates(0);
cdsB.ApplyUpdates(0);
scnnDemo.Commit(ATD);
except
scnnDemo.Rollback(ATD);
... 當cdsA更新出問題之後, 會跑出錯誤訊息, 但會繼續做下去, 不會跑到except裡, 所以cdsA失敗, cdsB成功. 我的cdsA與cdsB都是使用自己處理更新的寫法, 就是在它的TDataSetProvider之BeforeDataUpdate事件處理. 這應該沒關係吧? 假如是我自己的更新程式碼有問題, 那麼也應該跳到except段去Rollback所有的資料, 不是嗎? 已經連續問了好幾個dbExpress MSSQL的問題, 一直找不到正確的答案, 愈來愈沒信心了.
|
wb3599
一般會員 發表:32 回覆:32 積分:12 註冊:2004-02-11 發送簡訊給我 |
引言: 請教大家: 我參考李維大師的"Delphi 7 高效率程式一書" Page 2-28的範例實作, 有問題, 不知道要怎麼辦?我的環境是Delphi 7 dbExpress MS SQL 2000, 難道同樣的語法, 從Interbase換成MS SQL就不行嗎? 程式假設如下(只列重點): ... scnnDemo.StartTransaction(aTD); try cdsA.ApplyUpdates(0); cdsB.ApplyUpdates(0); scnnDemo.Commit(ATD); except scnnDemo.Rollback(ATD); ... 當cdsA更新出問題之後, 會跑出錯誤訊息, 但會繼續做下去, 不會跑到except裡, 所以cdsA失敗, cdsB成功. 我的cdsA與cdsB都是使用自己處理更新的寫法, 就是在它的TDataSetProvider之BeforeDataUpdate事件處理. 這應該沒關係吧? 假如是我自己的更新程式碼有問題, 那麼也應該跳到except段去Rollback所有的資料, 不是嗎? 已經連續問了好幾個dbExpress MSSQL的問題, 一直找不到正確的答案, 愈來愈沒信心了.我在推論, 會不會問題是出在TDataSetProvider上, 因為我在TDataSetProvider的BeforeUpdateUpdate裡的程式碼, 是照李維老師書上的寫法, 譬如說: procedure ...BeforeUpdateRecord(...); begin try .... Applied := True; except Applied := False; raise; end; end; 假設有兩個TDataSetProvider: dspA與dspB. 若dspA沒問題, 則因已Applied := True, 所以就接受這筆更新, 雖然dspB裡有問題, 卻不影響dspA已經成功執行完成的結果. 沒問題在try..except的程式若有問題, 並不會跑到except段去, 就會停在發生錯誤的那一行. 而dspA或dspB, 是因為以並不會影響原來呼叫它的cdsA或cdsB的ApplyUpdates(0)方法, 這邊好像都無法判斷裡面"曾經"有錯, 所以就一定會確認交易, 怎麼跑也永遠不會Rollback. 我在cdsA與cdsB的ReconcileError事件也有照李維老師的指示, 不過, 只對單一筆記錄有效, 若同時更新數筆資料, 並不會其中一筆有問題, 而影響到其它已經在dspA順利執行完成的程式碼. 請問大家看得懂我在說什麼嗎? 我推論是我不會用TDataSetProvider這個元件. 我應該要如何正確使用它呢? 謝謝大家的時間. |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
wb3599 你好: 1.改 cdsA.ApplyUpdates(-1); 可能比較恰當. 2.Provider.OnUpdateError Event 把 Error Raise 出來:
procedure TForm1.DataSetProvider1UpdateError(Sender: TObject; DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind; var Response: TResolverResponse); begin Response := rrAbort; // 指示 Provider 放棄 Update raise E; // Raise Exception end; |
stillalive
初階會員 發表:7 回覆:148 積分:41 註冊:2004-04-07 發送簡訊給我 |
|
wb3599
一般會員 發表:32 回覆:32 積分:12 註冊:2004-02-11 發送簡訊給我 |
引言: wb3599 你好: 1.改 cdsA.ApplyUpdates(-1); 可能比較恰當. 2.Provider.OnUpdateError Event 把 Error Raise 出來:Dear Mickey版主, stillalive大大: 我照了您的方式, 現在可以了! 比較關鍵的解決方案是在Mickey版主上, 所以我只能給Mickey版主結案分數, 請stillalive大大見諒! Mickey版主的兩行程式, 驚醒了我這個夢中人! 我又看到署光, 應該可以向上面交差了! 以下為題外話, 純屬個人去重慶南路找書的心得, 如有不妥, 請版主處置! 只是我很納悶的是, 像這麼重要的觀念, 李維大師的書從Delphi3, 4, 5到7, 怎麼都沒提到呢? 是不是因為這是很基本的觀念, 所以是我的問題嗎? 我沒有對李維大師任何不敬的意思, 我相信很多網友與我一樣, 靠李維大師的書來維持生計的, 而台灣若沒有李維大師的書來撐場面的話, 我想, Delphi可能會被市場所淘汰吧? 前天, 我曾為了這個問題, 去台北市重慶南路的天瓏書店, 想要找書來求解, 結果, 原文書一本也沒有, 我記得Delphi 6還有一些, 怎麼會這樣? 國產的書, 比不上VB.NET的一缸子, 只有蓼蓼可數的幾本, 而這幾本內容中, 只要不是以專題來寫書(如RS232, 遊戲, 進銷存), 其它的書大概就只能用搖頭兩個字來表達. 說難聽一點, 幾乎每一本都是以Delphi 1為標準, 然後慢慢加一點點不痛不癢的內容, 換換插圖, 書名還比內容還有可看性. 這些內容, 一點閱讀價值也沒有, 我大膽的說, 只要有一點點程式設計的基礎, 每天來逛ktop網站, 保證比看完這些書還有益處.procedure TForm1.DataSetProvider1UpdateError(Sender: TObject; DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind; var Response: TResolverResponse); begin Response := rrAbort; // 指示 Provider 放棄 Update raise E; // Raise Exception end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |