開發多數據庫切換的 COM+ 組件,需在運行時根據用戶身份動態連接不同數據庫。組件提供 ConnectTo(DBName) 方法設置目標庫,但調用後數據庫連接失敗,且後續調用報錯。
ConnectTo 中調用 SetComplete,導致 COM+ 認為任務完成,銷毀對象實例。下次調用時創建新實例,DBName 變回空值。EnableCommit,TmtsDataModule.AutoComplete 默認為 True,且在 OnActivate 時被重置為 True,導致首次數據操作後仍自動釋放。procedure TmtsDBConn.ConnectTo(sDBName: string);
begin
try
DBName := sDBName;
EnableCommit; // 不結束實例
except
SetAbort;
end;
end;
procedure TmtsDBConn.OnActivate;
begin
AutoComplete := False; // 關鍵:防止自動釋放
end;
procedure TmtsDBConn.ReleaseInstance;
begin
SetComplete; // 顯式釋放方法,客戶端調用完畢後調用
end;
DcomConnection1.Connected := True;
DcomConnection1.AppServer.ConnectTo('DB2');
ClientDataset1.Active := True;
// ... 多次操作 ...
DcomConnection1.AppServer.ReleaseInstance; // 顯式釋放
DcomConnection1.Connected := False;
OnActivate 中強制 AutoComplete := False。