關閉客戶端ClientDataSet時,怎樣將中間層相應DataSetProvider的數據集也關閉 |
尚未結案
|
dialog
一般會員 發表:33 回覆:18 積分:10 註冊:2002-09-07 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
dialog
一般會員 發表:33 回覆:18 積分:10 註冊:2002-09-07 發送簡訊給我 |
遠程數據模塊上有一個AdoQuery1連到sql server,和一個DataSetProvider1,
在Form1上有DBGrid1和DataSoure1,數據集為遠程數據模塊上的AdoQuery1. 客戶端的ClientDataSet1連到DataSetProvider1. A. 當ClientDataSet1.Active:=True時,客戶端和服務端的DBGrid中都可以 到已獲到數據
B. 當ClientDataSet1.Active:=False時,客戶端的DBGrid關閉,而服務端的DBGrid仍然有數據,可見服務端的AdoQuery1並沒有關閉
C. 好像隻有當DCOMConnection1.enabled:=False時(也就是客戶端退出),服務端的AdoQuery1才會關閉。 我並沒有改變預設值,服務端都是自動激活的, 按照這樣,如果服務端提供了很多DataSetProvider,客戶端打開過很多不同的ClientDataSet的話,那服務端不就佔很大的內存!這還隻是服務端為一個客戶端維護的一個Instance.
如果每次DCom都斷開的話,那第一次ClientDataSet.Open就會很慢。 能不能在以上的B時,也能將服務端的AdoQuery1也關閉?
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
我想應是你服務端的元件防止了 dataset 關閉
我的測試方法是 :
1. 在服務端不加入任何感知元件只加入一個Memo
2. 在所有DataSet 的 AfterOpen 加入 :
Form1.Memo1.Lines.Add(DataSet.Name ' opened at ' FormatDateTime('yyyy/mm/dd hh:nn:ss',now));
3. 在所有DataSet 的 AfterClose 加入 :
Form1.Memo1.Lines.Add(DataSet.Name ' closed at ' FormatDateTime('yyyy/mm/dd hh:nn:ss',now)); 在客戶端的ClientDataSet測試結果 :
1. 若 PacketRecords 設成 -1 (即時接受所有記錄),服務端的 DataSet 開啟後傳送後立即關閉,不用等客戶端的CDS關閉。
2. 若 PacketRecords 設成 0 (不傳送記錄只傳送meta data),服務端的 DataSet 開啟後不會自動關閉,CDS關閉後服務端的 DataSet 便關閉。
3. 若 PacketRecords 設成 >0 ,服務端的 DataSet 開啟後若還有未傳送的記錄便不會關閉,一旦所有記錄已傳送立刻關閉。 這應是合理且很有效率的做法。 註:我是使用DBX的,BDE也測試過也是一樣,我以前測試過ADO發覺很多問題後一向不使用ADO連ADO元件亦刪了所以沒試ADO。
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |