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

請問使用 Transactional DataModule 與 dbExpress 的問題

答題得分者是:speedup
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-06 14:20:33 IP:203.66.xxx.xxx 未訂閱
最近在實驗 3-Tier 的架構,不過在 Transactional DataModule 上遇到些問題,不知道有沒有人有類似的經驗可以提供我做參考?? 環境 : COM AP Server : 使用 Transactional DataModule(TMtsDataModule) 上面使用了 TSQLConnection , TSQLQuery, TDataSetProvider 元件 (dbExpress 元件) 關係為 TSQLConnection -> TSQLQuery -> TDataSetProvider Delphi 7 MSSQL 2000 Client AP: 使用 TForm 上面使用了 TDCOMConnection (可正常連線,取得 ServerName 與 ServerGUID) , TClientDataSet, TDBGrid , TDataSource ,TDBNavigator 關係為 TDCOMConnection -> TClientDataSet -> TDataSource 安裝 COM Server 元件後, Client AP 啟動後可以正常連接顯示資料,但是無法新增與刪除 (Trace 後,發現 ClientDataSet.ApplyUpdate(0) 後有發生錯誤,但無傳回 Exception 訊息),不過使用 TSQLMointor 將由 Server 端送往 SQL Server 的訊息 Log 起來看,都有正確的送出,且無 Abort 或錯誤產生 Rollback 現象, 但還是發生 Server 端 Raise Exception (災難性的失敗) 另外,嘗試將 Server 端之 DataSetProvider 的 ResolveToDataSet 改成 True後,無錯誤訊息,但也無法更新/刪除/新增資料 (Refresh 後恢復原狀),經 Log 後發現只送出 TSQLQuery 元件內的 SQL Command ,更新/刪除/新增 的 command 沒有送出.. 我有嘗試將 Server 端的改成普通的 DataModule 試驗過,使用 dbExpress 相當的正常,可以正常的存取資料 也嘗試過換了 ADO 元件代替 dbExpress 元件後,就沒有了上述的問題,可以正常執行.. 1. 想問有經驗的先進,上述問題是否為 dbExpress MSSQL 的問題?? 2. ADO 元件要如何 log 類似的 TSQLMonitor 傳送至 SQL Server 的訊息? ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-06 15:19:22 IP:211.75.xxx.xxx 未訂閱
SouthWind 你好 , 個人也遇過類似你的問題 , 不過我用的是Romote Modules , 後來改用ADOQuery才解決問題 . 你是否有關連兩個以上TABLES 作異動 . 我的經驗是直接用ClientDataSet.ApplyUpdates(0) 是行不通的 . 用ADO元件亦然 . by the way 問個小問題 1. Transacton Modules 與 Remote Modules 有何不同 ? 2. COM 與 COM 有何不同 ?
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-07 00:12:21 IP:211.76.xxx.xxx 未訂閱
引言: SouthWind 你好 , 個人也遇過類似你的問題 , 不過我用的是Romote Modules , 後來改用ADOQuery才解決問題 . 你是否有關連兩個以上TABLES 作異動 . 我的經驗是直接用ClientDataSet.ApplyUpdates(0) 是行不通的 . 用ADO元件亦然 . by the way 問個小問題 1. Transacton Modules 與 Remote Modules 有何不同 ? 2. COM 與 COM 有何不同 ?
因為是在實驗,所以我用了最簡單的架構,一個 TSQLQuery 對應一個資料庫 Table 而已,因為之前聽到一些關於 dbExpress 的 bug 傳言,一方面想了解 Multi-Tier 的架構,順便實驗一下 dbExpress 是否在 MSSQL 上真的很不"馬吉" ... 結果就如同我所描述的,在 Client/Server 架構上,所做的實驗都十分的順利.. 根據 TSQLMonitor 所 log 出的資訊,我可以做很彈性的微調 ... 在將 Data Module 轉成 Transactional Modules 或 Remote Data Module 就遭遇上述的問題,其實最近的文章我都有看,也都試過,也嘗試解決或釐清了很多問題,收穫頗豐,只是這個現象我苦思無解,能力又未到可以大膽斷言是 dbExpress 元件的問題 .. 我想這可能跟 dbExpress 使用 OLE DB 做底層驅動有關,或許還有不少 bug 要改,不過我個人是非常欣賞 dbExpress 彈性可微調的架構 .. 我對 Remote 元件 Debug 相當沒有經驗,目前只知道可以靠 IAppServer 所實作的 Method Raise Exception Message ,會傳到 Client 產生 Message Dialog ,不過不知道有沒有更精確可以攔截到 Error Message 或是發生錯的 code 位置而不是收到沒有頭緒的 (發生災難性失敗)?? 這是我很想知道的問題,各位先進在 Multi-Tier 架構中是如何做 Debug 工作的?? 關於您的問題,我就我看到的資料與自己實驗的理解,討論一下.. 不一定是對的,如果有錯,請用力指正 .. 1. Remote Data Module 在舊的 Delphi (忘了是哪一版以前),是以 DCOM 實作 ,但我在 Delphi 7 寫是出現在 COM 服務內,Transactional Data Module 以 COM 實作,我是覺得兩個使用起來都差不多,透過 IAppServer 可直接利用 TDataProvider 元件利用 TClientDataSet 直接對 Server 端 的 DataSet 做處裡,不過有一個差別,要使用 Remote Data Module 必須先 建立啟動一個 Process,Transactional Data Module 則不用 .. 2. COM , COM 最大差別應該在於 COM 加入權限控管, object Pooling,與 Transaction 機制,與比較高的效率微調..etc,不過 COM 的文字上的定義 很廣泛有的人解釋涵蓋了 OLE/OLE Automation/ActiveX ,演化史上來看 都是從OLE 演化而來, OLE/OLE Automation -> ActiveX -> DCOM -> COM .. COM 的本質是沒有改變,不過不斷演化精進了效率,與加入了許多功能 .. 忘了補充我的設定,我是 Thread Mode -> Apartment , Transaction Mode 選 Supports Transactions ,也實驗過 Does not Support transactions... 另外再請教各位先進, Transaction Mode 實際上會造成什麼影響?? PS. 關公面前耍大刀,希望能借此拋磚引玉 ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
jieshu
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-07 09:14:50 IP:203.204.xxx.xxx 未訂閱
引言: 你是否有關連兩個以上TABLES 作異動 . 我的經驗是直接用ClientDataSet.ApplyUpdates(0) 是行不通的 . 用ADO元件亦然 .
這我們在使用上完全沒有問題阿,用Query的話加個TUpdateSQL即可,ADOQuery的話我試過,只要異動一個Table的資料的話是沒問題。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
jieshu
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-07 09:37:16 IP:203.204.xxx.xxx 未訂閱
引言: 不過不知道有沒有更精確可以攔截到 Error Message 或是發生錯的 code 位置而不是收到沒有頭緒的 (發生災難性失敗)?? 這是我很想知道的問題,各位先進在 Multi-Tier 架構中是如何做 Debug 工作的??
用Remote Data Module的話,Debug是用Delphi執行Server程式,用檔案總管執行Client程式。Transactional Data Module我就不知道了。
引言: 1. Remote Data Module 在舊的 Delphi (忘了是哪一版以前),是以 DCOM 實作 ,但我在 Delphi 7 寫是出現在 COM 服務內,Transactional Data Module 以 COM 實作,我是覺得兩個使用起來都差不多,透過 IAppServer 可直接利用 TDataProvider 元件利用 TClientDataSet 直接對 Server 端 的 DataSet 做處裡,不過有一個差別,要使用 Remote Data Module 必須先 建立啟動一個 Process,Transactional Data Module 則不用 ..
Remote Data Module 一直是DCOM阿,請問你是如何讓他出現在COM 服務內,因為我執行後去元件服務裡找不到,用dcomcnfg.exe就可發現他在裡面。你所謂的要先建立啟動一個Process是指要執行Server程式嗎?我們在使用是Client執行連線時,Server會自動執行起來,所有Client關閉,Server正常的話會自己關閉。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-07 10:22:48 IP:203.66.xxx.xxx 未訂閱
引言: 用Remote Data Module的話,Debug是用Delphi執行Server程式,用檔案總管執行Client程式。Transactional Data Module我就不知道了。 Remote Data Module 一直是DCOM阿,請問你是如何讓他出現在COM 服務內,因為我執行後去元件服務裡找不到,用dcomcnfg.exe就可發現他在裡面。你所謂的要先建立啟動一個Process是指要執行Server程式嗎?我們在使用是Client執行連線時,Server會自動執行起來,所有Client關閉,Server正常的話會自己關閉。
Sorry ,我犯了沒有小心求證的毛病, 因我用 Delphi|Run-> Install COM Objects 的功能,在元件服務裡看到 COM 應用程式裡面有我輸入的應用程式目錄,就以為它是 COM 運作,我已在 DCOM 元件內找到我的元件,是以 DCOM 實作沒錯,感謝 jieshu 版主的指正 .. 關於啟動 Process 是我表達的不好,要使用 RDM DCOM 元件前,會先啟動一個 Process,如果這個 Process 結束 (無法喚起),則元件會失效,正如版主所言,只要正確安裝 DCOM 元件,是會自動喚起/關閉該 Process ... DCOM 剛接觸,不很了解,是否 DCOM 架構上就是以 Process 為元件的 container (這個名詞可能使用不當),還是只是 RDM 剛好是如此實作.. 關於 Debug 問題,要再請教一下 jieshu 版主,是否利用在 Server 元件上寫一些顯示訊息的 debug code,來作 debug?? 還是有更方便的做法 (例如: 有 Delphi IDE 環境顯示 Error 或是設 Break Point) ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-07 10:30:04 IP:203.66.xxx.xxx 未訂閱
引言:
引言: 你是否有關連兩個以上TABLES 作異動 . 我的經驗是直接用ClientDataSet.ApplyUpdates(0) 是行不通的 . 用ADO元件亦然 .
這我們在使用上完全沒有問題阿,用Query的話加個TUpdateSQL即可,ADOQuery的話我試過,只要異動一個Table的資料的話是沒問題。
附議,MSSQL BDE/ADO 元件蠻穩定的,同樣的架構 (Cleint/Server,3-Tier use MRT,RDM) Run 都沒有問題,一碰到 dbExpress (3-Tier) 就出現一堆問題, Client/Server 上倒是還好,沒有碰到很大的問題,大部分都有釐清,有很多部分是對於 dbExpress 的架構不熟悉,是有很多參數要調整的... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
speedup
資深會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-07 11:40:51 IP:61.224.xxx.xxx 未訂閱
引言: 1. Transacton Modules 與 Remote Modules 有何不同 ? 2. COM 與 COM 有何不同 ?
COM/DCOM/COM 差異請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=43706 Transacton Modules 與 Remote Modules的差異是蠻大的 Remote Modules 1.實作出DCOM(為exe) 2.可選擇寫成State 或 Stateless 3.可接ADO/BDE/DBExpress 等資料連結技術 4.在事件外,自行追加的介面方法中,必須妥善考慮交易的問題 Transacton Modules 1.實作出COM (為dll) 2.必須寫成Stateless (因為要支援MTS交易/資料庫or元件 Pooling的關係) 3.只能用ADO/BDE資料連結技術(這是因為要支援MTS交易,資料連結必須實做某些規格(名子我忘了),M$ 本身有為ADO,MS-SQL2000實做,Borland 也有為BDE實做BDE-MTS,因此也可以用) 4.如元件設計規劃恰當,理論上只要靠著指定元件的屬性(如支援交易,必須交易等)即可達到交易控制的目的,而不需撰寫資料庫的交易控制程式碼 當然用COM 最好還是搭配ADO / MS-SQL 2000 (都是M$的東西) 除此之外由於DataSnap技術本身存在許多Bug 必須靠經驗或奇怪作法來閃躲這些Bug,若初學者可等Delphi 7.1 update 來try 因該會省很多工 混心雜欲 棄修身~唉
------
唉~
jieshu
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-07 18:55:27 IP:203.204.xxx.xxx 未訂閱
引言: DCOM 剛接觸,不很了解,是否 DCOM 架構上就是以 Process 為元件的 container (這個名詞可能使用不當),還是只是 RDM 剛好是如此實作..
不好意思,這些M$的相關技術我沒有去好好研究,所以我也不太懂,我只會用Delphi的Remote Data Module。
引言: 關於 Debug 問題,要再請教一下 jieshu 版主,是否利用在 Server 元件上寫一些顯示訊息的 debug code,來作 debug?? 還是有更方便的做法 (例如: 有 Delphi IDE 環境顯示 Error 或是設 Break Point)
如上所言用Remote Data Module的話,Debug是用Delphi執行Server程式,用檔案總管執行Client程式。這樣,就可以設中斷點Debug了阿,和Client/Server沒兩樣!
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-07 22:44:39 IP:211.76.xxx.xxx 未訂閱
引言: 關於 Debug 問題,要再請教一下 jieshu 版主,是否利用在 Server 元件上寫一些顯示訊息的 debug code,來作 debug?? 還是有更方便的做法 (例如: 有 Delphi IDE 環境顯示 Error 或是設 Break Point)
如上所言用Remote Data Module的話,Debug是用Delphi執行Server程式,用檔案總管執行Client程式。這樣,就可以設中斷點Debug了阿,和Client/Server沒兩樣! [/quote] 對喔 ... 我怎麼沒有想到,感謝 jieshu 版主與 Speedup Sir 的指教.. 受益良多,還是多被"譙"一下,進步比較快... 請問一下 Speedup 兄, State 或 Stateless 有什麼差別,可否舉些具體的實例?? 日前看了李維先生的 "Delphi 7 高效率資料庫程式設計"一書,書中有一個利用 Transactional Object dbExpress 的範例,只不過不是連接 MSSQL .. 所以我猜想應該是可以 Work,我從 log 上覺得是 dbExpress raise 了奇怪的 Exception .. 不過,看完您的文章,我想到會不會是 Transaction Mode 的關係?? 我再作一些實驗,有結果再分享心得 ... PS. 我覺得這裡真好,可以討論技術,我是"黑手",所以跟我一樣寫程式的朋友跟同學都不多,嗯...抒發一下,大家不要介意.. 先預祝 jieshu 版主破百成功 ,恭喜恭喜 .. ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- 發表人 - SouthWind 於 2004/05/07 22:49:20
speedup
資深會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-10 09:14:11 IP:61.224.xxx.xxx 未訂閱
引言: 請問一下 Speedup 兄, State 或 Stateless 有什麼差別,可否舉些具體的實例?? 日前看了李維先生的 "Delphi 7 高效率資料庫程式設計"一書,書中有一個利用 Transactional Object dbExpress 的範例,只不過不是連接 MSSQL .. 所以我猜想應該是可以 Work,我從 log 上覺得是 dbExpress raise 了奇怪的 Exception ..
1.State 就是表示Server必須紀錄狀態,例如當ClientDataSet的PacketRecord大於0的時候,就表示Server必須紀錄目前Client的fetch筆數,當Server記錄狀態時會佔用較多的資源何資料庫連線,因此所能夠服務的Client數量也遠比Stateless少, 相對的Stateless強調的就是Server不保留任河clinet的狀態,因此服務完一個Client及可服務下一個(當然,在Stateless的設計上會強調物件的啟用速度,因此不要在一個MTSDataModule放太多Query/Table,若AP仍需計錄狀態,則需將狀態設計存在Client或Database中) 想想看,目前的純網頁應用,全部都屬無狀態,每次Request完就跟Server無關 ,若需紀錄Client端資訊,則以Cookie(存在Client端)/SessionID(每次由Client重送),這些機制都屬Stateless設計,這也就是網頁系統可同時服務上百人/上千人的原因(雖然用HTML/HTTP效率很差的傳輸協定) 2.如果你所設計的Transactional Object的交易屬性,設成不需交易,在程式碼中當然要自行控制所有必須與交易相關的程式碼,當然,由於是自己控制,所以要接DBExpress也無所謂 嗯嗯 我也預祝 jieshu 版主破百成功 ,恭喜恭喜 混心雜欲 棄修身~唉
------
唉~
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-16 12:22:50 IP:140.114.xxx.xxx 未訂閱
引言: 1.State 就是表示Server必須紀錄狀態,例如當ClientDataSet的PacketRecord大於0的時候,就表示Server必須紀錄目前Client的fetch筆數,當Server記錄狀態時會佔用較多的資源何資料庫連線,因此所能夠服務的Client數量也遠比Stateless少, 相對的Stateless強調的就是Server不保留任河clinet的狀態,因此服務完一個Client及可服務下一個(當然,在Stateless的設計上會強調物件的啟用速度,因此不要在一個MTSDataModule放太多Query/Table,若AP仍需計錄狀態,則需將狀態設計存在Client或Database中) 想想看,目前的純網頁應用,全部都屬無狀態,每次Request完就跟Server無關 ,若需紀錄Client端資訊,則以Cookie(存在Client端)/SessionID(每次由Client重送),這些機制都屬Stateless設計,這也就是網頁系統可同時服務上百人/上千人的原因(雖然用HTML/HTTP效率很差的傳輸協定) 2.如果你所設計的Transactional Object的交易屬性,設成不需交易,在程式碼中當然要自行控制所有必須與交易相關的程式碼,當然,由於是自己控制,所以要接DBExpress也無所謂 嗯嗯 我也預祝 jieshu 版主破百成功 ,恭喜恭喜 混心雜欲 棄修身~唉
感謝 speedup Sir 的指導,受益良多.. 經過您詳細的解說,我已經大致了解了 Stateless.. 另外針對 MTS 想請問一下, MTS 在 COM 究竟扮演如何的角色?? 我們寫出的 code 是如何加入 MTS 的功能?? ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
jieshu
版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-05-16 12:34:34 IP:61.70.xxx.xxx 未訂閱
引言: 嗯嗯 我也預祝 jieshu 版主破百成功 ,恭喜恭喜
謝謝!前幾天好像都沒收到論壇寄的信,看到SouthWind的回覆時,才看到你的祝福,也剛好晉百,謝謝你!
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
speedup
資深會員


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-05-17 09:29:43 IP:61.224.xxx.xxx 未訂閱
引言: 另外針對 MTS 想請問一下, MTS 在 COM 究竟扮演如何的角色?? 我們寫出的 code 是如何加入 MTS 的功能??
MTS= Microsoft Transaction Service ,已經是元件服務裡面的一項基本功能(Win2000以後的版本都有(98不確定)),只要你從TMTSDataModule繼承下來撰寫即可(即Transaction DataModule),但要注意的是,若寫在事件內,則不需作太多考量,但若自己寫interface方法請記的寫(SetComplete/SetAbort) 當然,想要達到正確的MTS交易,必須確認全部的環境都有支援MTS(Database,ADO/BDE,DCOM通訊協定),若未支援部份,必須自行做適當的變通應用 例如,N-Tier 架構下Clinet較常採用的是Socket通訊協定,因此MTS只能由AP Server 做,Client程式碼是無法直接建立交易程式碼的,因此在設計給Client呼叫的方法都必須確認在一次呼叫內將用於交易的資料全部傳遞完畢 混心雜欲 棄修身~唉
------
唉~
系統時間:2024-05-02 19:17:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!