為什麼DBName的值會丟掉呢?原來在是因為在ConnectTo中,調用了SetComplete方法,SetComplete方法認為這個COM+已經完成了任務,會釋放這個COM+對象,所以連接數據庫時,又創建了一個新的COM+,它的DBName當然是空值了。
找到了原因,把SetComplete改成EnableCommit; 編譯,再運行客戶端,終於運行成功,取回了DB2數據庫中的數據。
可是在客戶端程序中,放入另一個ClientDataSet,在打開ClientDataSet1之後,打開ClIEntDataSet2,想繼續訪問DB2中的數據,又報錯了。把程序改成
Dcomconnection1.APPServer.connect('DB2');
ClIEntDataset1.Active:=true;
ClIEntDataset1.Active:=false;
ClIEntDataset1.Active:=true;
即使只使用一個ClIEntDataSet,在它關閉之後,再打開時,依然會出錯。
但如果客戶端寫成
Dcomconnection1.APPServer.connect('DB2');
ClIEntDataset1.Active:=true;
Dcomconnection1.APPServer.connect('DB2');
ClIEntDataset2.Active:=true;
可以執行成功。但這樣似乎很不好看,COM+為什麼會在連接完數據庫後又把自己釋放呢?
原來,TmtsDataModule有一個AutoComplete屬性,默認值是true,所以在連接完數據庫之後,它還是會把自己釋放。
把AutoComlete設成false後,還是出錯,在COM+的OnActivate事件中跟蹤發現,當它被激活時,AutoComplete屬性被自動設為ture了,所以在它第一次連接數據庫後,依然會把自己釋放。
在COM+的OnOnActivate事件中,寫上:
AutoComplete:=false;
客戶端一次連接,多次訪問數據庫也沒有問題了。
但這樣一來,COM+就不會自動釋放了,需要在COM+中增加一個方法,在這個方法中SetComplete,然後在客戶端用完COM+後,調用這個方法來釋放COM+。
經過以上的摸索,得出以下的結論:在COM+中,如果要保持狀態信息,需要做一些工作,因為COM+默認是無狀態的,它每次被客戶端調用後,都會判斷是不是應該釋放自己,如果我們不想它釋放,就要人工加以干預,最後我們還要人工去釋放它。