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

ADODataSet CacelBatch可否回復整個明細檔資料

尚未結案
jasing
一般會員


發表:11
回覆:29
積分:8
註冊:2004-12-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-24 15:10:05 IP:203.204.xxx.xxx 未訂閱
Hello Dear 版主大人及各位先進好 :   小弟之前有請教一個Master-Detail ADOTable的問題(如下所示), 之後承蒙版主大人指導,後來我將原先ADOTable架構改為ADODataSet, 並使用UpdateBatch及CancelBatch的方式來更新及取消更新資料, 但問題來了,因我發現CancelBatch只能取消一筆明細檔資料的更新, 而我想要的卻是取消更新所有的明細資料,所以想要請問,ADO的CancelBatch是否設定只能取消更新一筆資料,還是因為我的後端資料庫是Access的關係,還是說,我有什麼沒有注意到的地方,我有按照版主大人的指示將以下參數設定好 :    CursorType屬性值需為ctKeyset或ctStatic LockType屬性值需為ltBatchUpdate 執行的SQL敘述需為Select敘述 CursorLocation屬性值需為clUseClient       但不知道為什麼,還是只能回復(取消)一筆明細檔資料,沒辦法將修改前的資料完全回復,所以再次向各位先進請教一下,如果無法以ADO Batch來處理,也只好用陣列來解決問題! 謝謝!    ================================================================== 回應文章內容  jasing Hello版主大人及各位先進好 : 小弟想請教一個關於使用Master-Detail ADOTable的問題, 因作業須求,小弟寫了一個類似像選擇不同表格,會產生各自的表格的程式, 所以在明細檔裡會將所選的表格樣版Title資料套入,例如套入第一筆紙張, 第二筆原子筆...讓User直接輸入數量,但後來發現在未進入明細檔,如不想輸入,可以取消,但進入明細檔後即無法取消,我主檔是使用TDBEdit,明細檔使用 DBGrid,因為是套表的方式所以明細檔沒有修改,刪除等資料編輯按鈕,只有在主檔有資料編輯按鈕,原以為只要使用 Master.cancel; Detail.cancel;這樣即可,但卻無作用,只要有修改就會直接儲存,想請各位大大指導一下! 謝謝!           cashxin2002 您好﹗    從您的描述來看﹐當使用者在主檔輸入資料然后進入明細檔的時候﹐主檔的資料已經做儲存的動作了﹐這樣的話﹐您可在對應主檔的ADOTable之BeforePost事件中﹐先用變數記錄下此筆記錄的唯一鍵值﹐當您准備取消的時候﹐雖然主檔的資料已經存入資料表中﹐但您還是可以根据此唯一鍵值對此筆資料做刪除的動作﹐另外一點﹐如果對M/D資料庫做取消的動作時﹐除了使用資料集元件的Cancel方法之外﹐可以試試使用Abort();方法﹐作用為取消Abort();以下的所有動作﹒    因為您是使用ADO存取﹐故也可使用另一種方法﹐就是ADO的BatchUpdate﹐此方法有點相似于BDE/IDAPI存取技術中的CachedUpdate﹐在沒有呼叫ADO資料集元件的UpdateBatch方法之前﹐所有的資料異動皆在快取記憶體中﹐當決定取消所有的資料異動時﹐可使用ADO資料集元件的CancelBatch方法來取消﹒ 此方法的好處是對資料的異動速度非常快﹐降低資料來源的負荷﹒ ADO資料集元件使用BatchUpdate方法的相關屬性條件﹕ CursorType屬性值需為ctKeyset或ctStatic LockType屬性值需為ltBatchUpdate 執行的SQL敘述需為Select敘述 CursorLocation屬性值需為clUseClient 注﹕當CursorLocation屬性值為clUseServer也可使用﹐缺點是無法使用Briefcase模型﹐而且在執行效率上不佳﹒    相關的使用方法在站內搜索一下﹐有很多相關的討論﹒    =================================  有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================      jasing Hello Dear版主大人 : 非常感謝您的詳細回答, 看來我還是得改為TADOQuery比較好控制, 謝謝您的指導!     
jamests
初階會員


發表:0
回覆:43
積分:28
註冊:2005-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-24 15:23:30 IP:211.75.xxx.xxx 未訂閱
您好:    完整交易機制的部份. 我們比較會利用StartTransation, Commit, RollBack, 這是資料庫系統提供的功能. 就是需同時發生的交易要同時存入資料庫, 否則全部退回.    ADODB系列的交易指令沒記錯的話是BeginTrans, CommitTrans, RollbackTrans. 也就是:    try // [   ADOConnection1.BeginTrans; . // 您的交易行為. . ADOConnection1.CommitTrans; except On E: Exception do begin // [ ADOConnection1.RollbackTrans; end; // ] On E: Exception end; // ] try...except 希望有所幫助, 供參考.
jasing
一般會員


發表:11
回覆:29
積分:8
註冊:2004-12-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-24 15:38:47 IP:203.204.xxx.xxx 未訂閱
Hello Jamests兄 : 謝謝您的指導,我有試過使用Connection Tran的控制, 但好像沒有辦法回復原值,可能是我哪裡沒注意到, 我會再試試, 謝謝!
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-25 00:04:27 IP:61.59.xxx.xxx 未訂閱
我想應該是你的程式在每一筆 Detail 的儲存後或刪除後或移動後的處理上 有做了 UpdateBatch 處理, 把異動的資料回存到資料庫了. 所以你最後 CancelBatch 都只會回復最後修改的 Detail Record. 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-25 00:13:25 IP:61.59.xxx.xxx 未訂閱
剛剛回想了一下就我記憶所及 ADOQuery 在 BatchUpdate 的模式下 處理資料的更新 Detail.UpdateBatch 執行時點應該是在 Master.AfterPost. 不是在 Detail.AfterPost 中處理喔. 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
jasing
一般會員


發表:11
回覆:29
積分:8
註冊:2004-12-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-25 00:29:19 IP:203.70.xxx.xxx 未訂閱
Hello Bestlong兄,您好: 這樣就是說,只要在Master的AfterPost做UpdateBatch就可以了? 我是在Master及Detail的AfterPost都有做UpdateBatch, 我再試試看好了,謝謝您的指導!
jasing
一般會員


發表:11
回覆:29
積分:8
註冊:2004-12-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-25 01:01:43 IP:203.70.xxx.xxx 未訂閱
Hello BestLong兄您好: 經我測試果然可以,我在Master的AfterPost執行Master及Detail的UpdateBatch, 並在Master的AfterCancel執行Master及Detail的CancelBatch, 即可解決此問題,並且不用去撰寫Tran Control程序,問題已解決,感謝BestLong兄及各位先進的指導,謝謝!
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-01-26 13:55:56 IP:211.22.xxx.xxx 未訂閱
引言: Hello BestLong兄您好: 經我測試果然可以,我在Master的AfterPost執行Master及Detail的UpdateBatch, 並在Master的AfterCancel執行Master及Detail的CancelBatch, 即可解決此問題,並且不用去撰寫Tran Control程序,問題已解決,感謝BestLong兄及各位先進的指導,謝謝!
如果在一個完整的交易流程下要異動一個 Table 以上, 或是異動同一 Table 多筆紀錄. Transation Control 還是必要的喔. 試想, 當你同一時間異動 5 筆 Detail 然後 BatchUpdate, 對程式來說本質上還是一筆一筆的去處理, 若是在處理第 3 筆時發生了錯誤. 那麼在沒有 Transation 控管下 第 1,2 筆已更新到資料庫 3,4,5 筆沒有更新 那這樣資料就對不起來了. 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
jasing
一般會員


發表:11
回覆:29
積分:8
註冊:2004-12-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-01-27 00:35:01 IP:203.70.xxx.xxx 未訂閱
Hello 雪龍兄 : 感謝您的再次解說,讓我更加地清晰整個流程, 謝謝!
系統時間:2024-06-18 23:40:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!