程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 如何在Delphi中維護COM+的狀態信息(2)

如何在Delphi中維護COM+的狀態信息(2)

編輯:Delphi

為什麼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+默認是無狀態的,它每次被客戶端調用後,都會判斷是不是應該釋放自己,如果我們不想它釋放,就要人工加以干預,最後我們還要人工去釋放它。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved