請問,在我DLL還沒放入MTS裡時,一切正常,但為什麼當我的DLL放在MTS裡時,回傳的Recordset就變成空的(在DLL裡有取得資料),可是前端卻收不到,環境NT sp6,option pack 中文,vb 英文,後來改為中文的vb也不行,使用2.0的ADO.還請高手指教.
這是因為DLL所取回的Recordset 在還沒有傳回前端時,變數就被清除掉了。我想你大概有使用 Setcomplete 或是 Setabort 方法吧,如果你在取回資料後就呼叫這兩個方法的話,就會有這種情形發生,我已經遇過了,解決方法是:將這兩個方法移到Class_Terminate 事件中就可解決這個問題。
我想這和setcomplete沒有太多關係,重點在於有沒有在setcomplete 前把recordset變成offline, 詳查本人網站 http://www.hosp.ncku.edu.tw/~cww
CWW 說得沒錯,當你回傳 recordset 物件時,記得要先把 recordset 的 ActiveConnection 設為 Nothing,這樣該 recordset 就會變成 disconnected recordset。這樣應該可以解決你的問題。
對不起!我不認為是這個樣子,因為透過 ADO 物件所傳回的 Recordset 資料,應該已經存在於 Client 端的 Recordset 物件變數裡,也就是說實際上資料已經傳回到 Client 端的記憶體中,我覺得跟 ADO 物件是否 Connect 或 Disconnect 應該沒有多大的關係,因為個人也曾遇過這個問題,我測試的方式是:使用 ADO 的 Connection 物件,透過該物件的 Execute 方法直接執行 SQL 指令(例如:select * from employees),該指令所傳回的資料會存放在一個 Recordset 的變數中,執行完畢後 Close Connection ,再將該變數傳回到前端,然後呼叫 Setcomplete 方法。經測試的結果顯示,即使我把 Connection Close 起來,然後再把資料傳回 DLL 的前端,前端所得到的資料還是空的,但我確定一定有資料(使用 SQL Server 中的 Northwind 資料庫),也就是說物件所取得的資料並沒有傳回到前端,資料在 DLL 物件 Return 到前端之前已經被清除掉了;但如果我把 Setcomplete 方法移到 Class_Terminate 事件中或是乾脆不使用 Setcomplete 方法的話,一切就都沒有問題。我不是很清楚 MTS 物件中的 Setcomplete 、Setabort 方法實際上如何運作,只是有過這樣的經驗與測試結果,提出來與大家討論,尚望各位不吝指教,謝謝!
因為MTS必須在Server端處理許多Components,若是每個DLL都要求MTS Maintain Records時,伺服器的資源很快就玩完了,所以MTS[鼓勵]使用Stateless的物件,而對Recordset也會進行[管制],這點是確認的!所以確實如小吳或CWW說的,與有否SetComplete無關.而截至目前的解決方法,也的確只有Disconnect Recordset,但在BatchUpdate時,又要注意到Database的consist問題.
關於以上問題,經個人翻閱 MSCTEC 教材後,發現正如各位所言,是我自己搞糊塗了。但是讓我感到疑惑的是:我的測試結果卻是與教材內容有所出入,不知各位可否告訴我為什麼?因為我也曾經測過,把 Setcomplete 與 Close Connection 同樣放在 Class_Terminate 事件中,如此可以正常運作,但是如果把 Setcomplete 放在物件的方法中的話,則資料就無法傳回前端,各位可否猜測是何原因?謝謝!
既然你已經翻過 CTEC 教材,上面有提到喔! 當你呼叫的 method 使用 SetComplete 或 SetAbort 時,一旦該 method 結束 MTS 就把這個物件 deactive (釋放) 掉了。所以你存在變數的東東就不見了,當然你的 recordset 也就清空了。這就是為什麼我們一直提到要使用 disconnect recordset 的綠故。 又,SetComplete 等指令應該不能放在 Class_Initialize 及 Class_Terminate 這個地方喔! 由於歸 MTS 控管的元件可能會隨時被 deactive,把程式寫在這個事件內可能會導致奇怪的結果發生。
謝謝小吳的解說!補充一點,你所說的物件會被釋放掉,指的應該是阿柳兄所說的 Stateless 物件,但在 MTS 中另有一個 Stateful 物件,根據 CTEC 教材的說法,可以透過 SPM 做到資源共享,我是沒有測過,不知道有沒有人測過這個東東?此外,關於 Setcomplete 方法要放在哪一事件中,我不是很清楚小吳所說的奇怪結果是什麼,只是我所測試下來的結果,把 Setcomplete 方法放在 Class_Terminate 事件中 Run 起來都很正常,所以是不是可以麻煩小吳再解說清楚一點何謂奇怪的結果,謝謝!
Hi!! 各位先進,大家好!! , 請問一下: MR. Rick 於12/23/99 17:42:04 , 提出問題中有提到MSCTEC 教材, 可否告知此教材是甚麼東東 , 謝謝!!!