麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

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

2019-11-18 18:22:58
字體:
來源:轉載
供稿:網(wǎng)友

Delphi中如何維護COM+的狀態(tài)信息

劉曉明(cipherliu

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

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

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

PRocedure   TmtsDBConn.ConnectTo(sDBName:string)

begin

  try

     DBName:=sDBName;

     SetComplete;

  Except

    SetAbort;

  end;

end;

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

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

這里的ConnectStringAConnectStringC是為了動態(tài)構建連接字符串,預先設置好的字符串常量,如下:

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+。然后編寫客戶端程序調(diào)用它。

在客戶端程序中放一個DCOMConnection,連接到上面編寫COM+服務器,再放一個ClientDataSet,設置它的RemoteServerProvider屬性,然后在它的CommandText中寫入SQL語句。然后,放入DataSource控件和DBGrid控件,建立好它們之間的連接關系。最后放一個按鈕,在它的Click事件中:

 

Dcomconnection1.Connected:=true;

Dcomconnection1.AppServer.connect('DB2');

ClientDataset1.Active:=true;

Dcomconnection1.Connected:=false;

 

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

回到COM+的工程,調(diào)試它,在ConnectToadocBeforeConnect中設置斷點,發(fā)現(xiàn)程序執(zhí)行到

DBName:=sDBName;

時,確實已經(jīng)把DBName的值設為”DB2”了,但是在執(zhí)行

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

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

為什么DBName的值會丟掉呢?原來在是因為在ConnectTo中,調(diào)用了SetComplete方法,SetComplete方法認為這個COM+已經(jīng)完成了任務,會釋放這個COM+對象,所以連接數(shù)據(jù)庫時,又創(chuàng)建了一個新的COM+,它的DBName當然是空值了。

找到了原因,把SetComplete改成EnableCommit; 編譯,再運行客戶端,終于運行成功,取回了DB2數(shù)據(jù)庫中的數(shù)據(jù)。

可是在客戶端程序中,放入另一個ClientDataSet,在打開ClientDataSet1之后,打開ClientDataSet2,想繼續(xù)訪問DB2中的數(shù)據(jù),又報錯了。把程序改成

 

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;

可以執(zhí)行成功。但這樣似乎很不好看,COM+為什么會在連接完數(shù)據(jù)庫后又把自己釋放呢?

原來,TmtsDataModule有一個AutoComplete屬性,默認值是true,所以在連接完數(shù)據(jù)庫之后,它還是會把自己釋放。

AutoComlete設成false后,還是出錯,在COM+OnActivate事件中跟蹤發(fā)現(xiàn),當它被激活時,AutoComplete屬性被自動設為ture了,所以在它第一次連接數(shù)據(jù)庫后,依然會把自己釋放。

COM+OnOnActivate事件中,寫上:

   AutoComplete:=false;

客戶端一次連接,多次訪問數(shù)據(jù)庫也沒有問題了。

但這樣一來,COM+就不會自動釋放了,需要在COM+中增加一個方法,在這個方法中SetComplete,然后在客戶端用完COM+后,調(diào)用這個方法來釋放COM+

經(jīng)過以上的摸索,得出以下的結論:在COM+中,如果要保持狀態(tài)信息,需要做一些工作,因為COM+默認是無狀態(tài)的,它每次被客戶端調(diào)用后,都會判斷是不是應該釋放自己,如果我們不想它釋放,就要人工加以干預,最后我們還要人工去釋放它。

 


上一篇:在Delphi7中調(diào)試COM+

下一篇:Delphi模式編程之策略模式(下)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關注

主站蜘蛛池模板: 久久免费视频在线 | 99久久电影| 亚洲涩涩图 | 狠狠干91 | 毛片在哪里看 | av影院在线播放 | 伦理三区 | 欧美成人久久 | 免费看日产一区二区三区 | 欧美日韩视频第一页 | 一级电影在线观看 | 网站激情 | 狠狠色噜噜狠狠狠米奇9999 | 二区国产| 精品在线观看一区 | 91久久夜色精品国产网站 | 黄色网址在线视频 | 成人视屏网站 | 成人情欲视频在线看免费 | 国产亲子伦在线观看 | 日韩av在线播放一区 | 亚洲免费视频一区 | 黄色片免费在线播放 | vidz 98hd | 羞羞视频免费网站含羞草 | 成人在线观看一区 | 精品一区二区在线播放 | 97porn| 久久99国产精品免费网站 | 人人舔人人舔 | 看全色黄大色黄大片女图片 | 全黄性性激高免费视频 | 麻豆小视频在线观看 | 欧美性生交xxxxx免费观看 | 国产1区2区3区中文字幕 | 国产精品jk白丝蜜臀av软件 | 黄色免费在线网址 | 高清在线观看av | 国产精品久久久久久久久粉嫩 | 日韩欧美中文字幕视频 | 成人羞羞网站入口 |