回到COM+的工程調試它在ConnectTo和adocBeforeConnect中設置斷點發現程序執行到
DBName:=sDBName;
時確實已經把DBName的值設為DB了但是在執行
adocConnectionString:=ConnectStringA+´Initial Catalog=´+DBName+´;´+ConnectStringC;
時DBName又成了空字符串所以出錯了
為什麼DBName的值會丟掉呢?原來在是因為在ConnectTo中調用了SetComplete方法SetComplete方法認為這個COM+已經完成了任務會釋放這個COM+對象所以連接數據庫時又創建了一個新的COM+它的DBName當然是空值了
找到了原因把SetComplete改成EnableCommit; 編譯再運行客戶端終於運行成功取回了DB數據庫中的數據
可是在客戶端程序中放入另一個ClientDataSet在打開ClientDataSet之後打開ClientDataSet想繼續訪問DB中的數據又報錯了把程序改成
DcomconnectionAppServerconnect(´DB´);
ClientDatasetActive:=true;
ClientDatasetActive:=false;
ClientDatasetActive:=true;
即使只使用一個ClientDataSet在它關閉之後再打開時依然會出錯
但如果客戶端寫成
DcomconnectionAppServerconnect(´DB´);
ClientDatasetActive:=true;
DcomconnectionAppServerconnect(´DB´);
ClientDatasetActive:=true;
可以執行成功但這樣似乎很不好看COM+為什麼會在連接完數據庫後又把自己釋放呢?
原來TmtsDataModule有一個AutoComplete屬性默認值是true所以在連接完數據庫之後它還是會把自己釋放
把AutoComlete設成false後還是出錯在COM+的OnActivate事件中跟蹤發現當它被激活時AutoComplete屬性被自動設為ture了所以在它第一次連接數據庫後依然會把自己釋放
在COM+的OnOnActivate事件中寫上
AutoComplete:=false;
客戶端一次連接多次訪問數據庫也沒有問題了
但這樣一來COM+就不會自動釋放了需要在COM+中增加一個方法在這個方法中SetComplete然後在客戶端用完COM+後調用這個方法來釋放COM+
經過以上的摸索得出以下的結論在COM+中如果要保持狀態信息需要做一些工作因為COM+默認是無狀態的它每次被客戶端調用後都會判斷是不是應該釋放自己如果我們不想它釋放就要人工加以干預最後我們還要人工去釋放它
[] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/24838.html