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

dbExpress交易有問題?

答題得分者是:Mickey
wb3599
一般會員


發表:32
回覆:32
積分:12
註冊:2004-02-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-10 01:52:53 IP:61.230.xxx.xxx 未訂閱
請教大家: 我參考李維大師的"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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-10 09:58:07 IP:61.230.xxx.xxx 未訂閱
引言: 請教大家: 我參考李維大師的"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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-10 21:14:13 IP:218.32.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-10 21:52:17 IP:211.75.xxx.xxx 未訂閱
建議你試用下法 try cdsA.ApplyUpdates(0); try cdsB.ApplyUpdates(0); except scnnDemo.Rollback(ATD); end; except scnnDemo.Rollback(ATD); end; 發表人 - stillalive 於 2004/05/10 21:54:34
wb3599
一般會員


發表:32
回覆:32
積分:12
註冊:2004-02-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-10 23:44:19 IP:61.230.xxx.xxx 未訂閱
引言: 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;
Dear Mickey版主, stillalive大大: 我照了您的方式, 現在可以了! 比較關鍵的解決方案是在Mickey版主上, 所以我只能給Mickey版主結案分數, 請stillalive大大見諒! Mickey版主的兩行程式, 驚醒了我這個夢中人! 我又看到署光, 應該可以向上面交差了! 以下為題外話, 純屬個人去重慶南路找書的心得, 如有不妥, 請版主處置! 只是我很納悶的是, 像這麼重要的觀念, 李維大師的書從Delphi3, 4, 5到7, 怎麼都沒提到呢? 是不是因為這是很基本的觀念, 所以是我的問題嗎? 我沒有對李維大師任何不敬的意思, 我相信很多網友與我一樣, 靠李維大師的書來維持生計的, 而台灣若沒有李維大師的書來撐場面的話, 我想, Delphi可能會被市場所淘汰吧? 前天, 我曾為了這個問題, 去台北市重慶南路的天瓏書店, 想要找書來求解, 結果, 原文書一本也沒有, 我記得Delphi 6還有一些, 怎麼會這樣? 國產的書, 比不上VB.NET的一缸子, 只有蓼蓼可數的幾本, 而這幾本內容中, 只要不是以專題來寫書(如RS232, 遊戲, 進銷存), 其它的書大概就只能用搖頭兩個字來表達. 說難聽一點, 幾乎每一本都是以Delphi 1為標準, 然後慢慢加一點點不痛不癢的內容, 換換插圖, 書名還比內容還有可看性. 這些內容, 一點閱讀價值也沒有, 我大膽的說, 只要有一點點程式設計的基礎, 每天來逛ktop網站, 保證比看完這些書還有益處.
系統時間:2024-06-02 9:10:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!