亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

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

2019-11-18 18:22:58
字體:
來源:轉載
供稿:網友

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

劉曉明(cipherliu

問題是這樣開始的:我需要寫一個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”,這是默認值,然后在adocBeforeConnect事件中:

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

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

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,設置它的RemoteServerProvider屬性,然后在它的CommandText中寫入SQL語句。然后,放入DataSource控件和DBGrid控件,建立好它們之間的連接關系。最后放一個按鈕,在它的Click事件中:

 

Dcomconnection1.Connected:=true;

Dcomconnection1.AppServer.connect('DB2');

ClientDataset1.Active:=true;

Dcomconnection1.Connected:=false;

 

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

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

DBName:=sDBName;

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

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

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

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

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

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

 

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;

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

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

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

COM+OnOnActivate事件中,寫上:

   AutoComplete:=false;

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

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

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

 


上一篇:在Delphi7中調試COM+

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

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

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品中文字幕| 热re99久久精品国产66热| 欧美性猛交xxxx久久久| 久久人91精品久久久久久不卡| 精品国产91久久久| 色偷偷偷综合中文字幕;dd| 一道本无吗dⅴd在线播放一区| 欧美日韩中文在线观看| 午夜精品蜜臀一区二区三区免费| www欧美日韩| 久久视频在线直播| 国产成人在线亚洲欧美| 在线看日韩av| 国产99久久久欧美黑人| 欧美视频一二三| 国产精品福利在线| 亚洲日本欧美中文幕| 亚洲乱码av中文一区二区| 国产成人精品网站| 久久久久九九九九| 国产精品免费网站| 777午夜精品福利在线观看| 97视频在线播放| 成人国产精品日本在线| 综合激情国产一区| 国产精品久久久久久久久久久久| 97在线观看视频| 久久精品中文字幕| 一本色道久久综合狠狠躁篇的优点| 成人av电影天堂| 欧美国产第二页| 中文字幕在线日韩| 亚洲欧美日韩精品久久亚洲区| 国产这里只有精品| 影音先锋欧美精品| 91香蕉国产在线观看| 日韩视频一区在线| 91精品国产九九九久久久亚洲| 精品国产一区二区三区久久狼黑人| 欧美视频二区36p| 中文字幕亚洲自拍| 成人午夜小视频| 亚洲欧洲日产国码av系列天堂| 国产精品视频永久免费播放| 国内久久久精品| 国产乱人伦真实精品视频| 国产suv精品一区二区| 欧美日韩亚洲激情| 国产91热爆ts人妖在线| 亚洲国产精品一区二区久| 懂色av影视一区二区三区| 欧美日韩色婷婷| 91精品国产乱码久久久久久久久| 国产ts人妖一区二区三区| 激情成人中文字幕| 国产精品久久久久久久久久久久久久| 亚洲国内高清视频| 国产亚洲aⅴaaaaaa毛片| 国产精品天天狠天天看| 欧美色播在线播放| 久久久久99精品久久久久| 久久综合久久八八| 另类少妇人与禽zozz0性伦| 亚洲乱码国产乱码精品精天堂| 91精品免费视频| 91在线视频九色| 中文字幕日韩电影| 欧美影院在线播放| 亚洲香蕉成视频在线观看| 亚洲天堂视频在线观看| 亚洲综合国产精品| 日本中文字幕不卡免费| 日本精品久久中文字幕佐佐木| 777午夜精品福利在线观看| 国产精品亚洲аv天堂网| 亚洲成人精品久久| 国产视频在线一区二区| 精品久久久久久久久久ntr影视| 成人高h视频在线| 在线播放国产一区二区三区| 欧美性资源免费| 91九色国产在线| 亚洲欧美日韩第一区| 伊人伊人伊人久久| 在线观看欧美日韩| 亚洲区中文字幕| 国产成+人+综合+亚洲欧洲| 色婷婷综合久久久久中文字幕1| 国产精品爽爽爽| 国产成人精品av在线| 国产精品都在这里| 欧美在线一区二区视频| 国产精品一区久久| 国产69久久精品成人看| 国产精品99久久99久久久二8| 色多多国产成人永久免费网站| 精品国产视频在线| 欧美日韩日本国产| 成人福利网站在线观看| 久久精品亚洲热| 久久久91精品| 亚洲精品国产综合区久久久久久久| 亚洲大尺度美女在线| 中文字幕av一区中文字幕天堂| 亚洲综合视频1区| 欧美成人精品一区二区三区| 国产亚洲欧美另类中文| 日本精品在线视频| 最新亚洲国产精品| 亚洲伊人第一页| 国产香蕉精品视频一区二区三区| 日韩大片免费观看视频播放| 日韩在线观看免费| 亚洲成人精品在线| 欧美激情a∨在线视频播放| 国产精品久久久久久久久久久久久久| 81精品国产乱码久久久久久| 中文字幕av一区| 欧美精品日韩三级| 亚洲精品久久久久久久久久久久久| 亚洲精品一区二区网址| 国产精品美女久久久久久免费| 97高清免费视频| 日韩中文字幕久久| 超碰97人人做人人爱少妇| 狠狠操狠狠色综合网| 亚洲性线免费观看视频成熟| 理论片在线不卡免费观看| 日韩av在线影视| 伦伦影院午夜日韩欧美限制| 欧美黑人视频一区| 欧美激情一级二级| 美乳少妇欧美精品| 一区二区福利视频| 91精品国产色综合久久不卡98口| 日韩av第一页| 91av免费观看91av精品在线| 尤物99国产成人精品视频| 欧美高清无遮挡| 91免费的视频在线播放| 色午夜这里只有精品| 欧美体内谢she精2性欧美| 国产午夜精品全部视频在线播放| 亚洲精品美女在线观看| 亚洲国产精品va在看黑人| 美女视频久久黄| 国产一区二区三区免费视频| 日韩在线中文字幕| 成人有码在线播放| 日韩成人激情在线| 色先锋久久影院av| 国产精品久久久久9999| 国产精品91久久久| 国自在线精品视频| 亚洲欧美一区二区精品久久久| 欧美激情网友自拍| 国产精品91久久久久久| 久久久久国产精品免费网站| 自拍视频国产精品| 日韩精品在线视频美女| 有码中文亚洲精品| 这里只有精品视频| 国产精品美女视频网站| 久热在线中文字幕色999舞|