天天看點

在Delphi中如何維護COM+的狀态資訊

 在Delphi中如何維護COM+的狀态資訊

   問題是這樣開始的:我需要寫一個COM+,用來連接配接不同的資料庫。有的朋友可能會說,應該為每個資料庫建立一個COM+,但是在我的系統裡不能這樣。

   我們在做一個教育輔助系統,使用者是學校(當然包括學校裡的老師、學生、家長),我們為每個學校建一個資料庫,這些資料庫的結構是相同。當然我們還有管理資料庫,用于協調各資料庫的關系。每增加一個學校使用者,我們就激活一個新的資料庫給客戶使用,也就是說,我們的資料庫的個數是不斷增加的,而我們的用戶端隻有一個,我們不會為每個學校開發不同的用戶端,我們的COM+也隻有一組,而不是為每個資料庫開發一組。是以我必須在COM+中根據使用者的身份讓它去連接配接不同的資料庫。很顯然,這個COM+應當提供一個方法,讓其調用者(可以是用戶端應用程式,也可以是其它的中間件)去選擇連接配接的資料庫,在實際中我們是根據使用者的ID在管理庫中查到它的資料庫名,然後連接配接使用者資料庫,在這裡,為了簡化問題,我們認為調用者已經知道了資料庫的名字,而直接要求調用這個資料庫。在COM+的類中增加一個私有成員DBName:string,用于儲存要連接配接的資料庫名稱。還應該提供這樣一個方法來設定它的值,我開始是這樣寫的

1. procedure TmtsDBConn.ConnectTo(sDBName:string);
2. begin
3. try
4. SetComplete;
5. Except
6. SetAbort;
7. end;
8. end;      

   然後在其中放入ADOConnection,ADODataSet,和DataSetProvider控件,分别取名為adoc,adods,dsp。設定好它們之間的連接配接關系,把adoc的連接配接字元串設為連接配接資料庫“DB1”,這是預設值,然後在adoc的BeforeConnect事件中:

adoc.ConnectionString:=ConnectStringA+'Initial Catalog='+DBName+';'+ConnectStringC;

這裡的ConnectStringA和ConnectStringC是為了動态建構連接配接字元串,預先設定好的字元串常量,如下:

constConnectStringA='Provider=SQLOLEDB.1;Password=2003;Persist Security Info=True;User ID=sa;';ConnectStringB='Initial Catalog=DB1;';ConnectStringC='Data Source=server3;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=LXM;Use Encryption for Data=False;Tag with column collation when possible=False';      

編譯、安裝這個COM+。

   然後編寫用戶端程式調用它。在用戶端程式中放一個DCOMConnection,連接配接到上面編寫COM+伺服器,再放一個ClientDataSet,設定它的RemoteServer和Provider屬性,然後在它的CommandText中寫入SQL語句。然後,放入DataSource控件和DBGrid控件,建立好它們之間的連接配接關系。最後放一個按鈕,在它的Click事件中: 

Dcomconnection1.Connected:=true;
Dcomconnection1.AppServer.connect('DB2');
ClientDataset1.Active:=true;
Dcomconnection1.Connected:=false;      
Dcomconnection1.AppServer.connect('DB2');ClientDataset1.Active:=true;
ClientDataset1.Active:=false;
ClientDataset1.Active:=true;      
Dcomconnection1.AppServer.connect('DB2');
ClientDataset1.Active:=true;
Dcomconnection1.AppServer.connect('DB2');
ClientDataset2.Active:=true;