萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> 在Delphi中如何維護COM+的狀態信息

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

  問題是這樣開始的:我需要寫一個COM+,用來連接不同的數據庫。有的朋友可能會說,應該為每個數據庫建立一個COM+,但是在我的系統裡不能這樣。我們在做一個教育輔助系統,用戶是學校(當然包括學校裡的老師、學生、家長),我們為每個學校建一個數據庫,這些數據庫的結構是相同。當然我們還有管理數據庫,用於協調各數據庫的關系。每增加一個學校用戶,我們就激活一個新的數據庫給客戶使用,也就是說,我們的數據庫的個數是不斷增加的,而我們的客戶端只有一個,我們不會為每個學校開發不同的客戶端,我們的COM+也只有一組,而不是為每個數據庫開發一組。所以我必須在COM+中根據用戶的身份讓它去連接不同的數據庫。

  很顯然,這個COM+應當提供一個方法,讓其調用者(可以是客戶端應用程序,也可以是其它的中間件)去選擇連接的數據庫,在實際中我們是根據用戶的ID在管理庫中查到它的數據庫名,然後連接用戶數據庫,在這裡,為了簡化問題,我們認為調用者已經知道了數據庫的名字,而直接要求調用這個數據庫。

  在COM+的類中增加一個私有成員DBName:string,用於保存要連接的數據庫名稱。還應該提供這樣一個方法來設置它的值,我開始是這樣寫的

  

procedure   TmtsDBConn.ConnectTo(sDBName:string);

begin

  try

     DBName:=sDBName;

     SetComplete;

  Except

    SetAbort;

  end;

end;

 

  然後在其中放入ADOConnection,ADODataSet,和DataSetProvider控件,分別取名為adoc,adods,dsp。設置好它們之間的連接關系,把adoc的連接字符串設為連接數據庫“DB1”,這是默認值,然後在adoc的BeforeConnect事件中:

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

  這裡的ConnectStringA和ConnectStringC是為了動態構建連接字符串,預先設置好的字符串常量,如下:

  const

  ConnectStringA='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;

  這段代碼是想測試一下,能不能訪問到DB2數據庫的數據。可是結果是,點下按鈕時,總是報錯,這是什麼原因呢?

  回到COM+的工程,調試它,在ConnectTo和adocBeforeConnect中設置斷點,發現程序執行到

  DBName:=sDBName;

  時,確實已經把DBName的值設為”DB2”了,但是在執行

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

  時,DBName又成了空字符串,所以出錯了。

  為什麼DBName的值會丟掉呢?原來在是因為在ConnectTo中,調用了SetComplete方法,SetComplete方法認為這個COM+已經完成了任務,會釋放這個COM+對象,所以連接數據庫時,又創建了一個新的CO

copyright © 萬盛學電腦網 all rights reserved