問題是這樣開始的我需要寫一個COM+用來連接不同的數據庫有的朋友可能會說應該為每個數據庫建立一個COM+但是在我的系統裡不能這樣我們在做一個教育輔助系統用戶是學校(當然包括學校裡的老師學生家長)我們為每個學校建一個數據庫這些數據庫的結構是相同當然我們還有管理數據庫用於協調各數據庫的關系每增加一個學校用戶我們就激活一個新的數據庫給客戶使用也就是說我們的數據庫的個數是不斷增加的而我們的客戶端只有一個我們不會為每個學校開發不同的客戶端我們的COM+也只有一組而不是為每個數據庫開發一組所以我必須在COM+中根據用戶的身份讓它去連接不同的數據庫
很顯然這個COM+應當提供一個方法讓其調用者(可以是客戶端應用程序也可以是其它的中間件)去選擇連接的數據庫在實際中我們是根據用戶的ID在管理庫中查到它的數據庫名然後連接用戶數據庫在這裡為了簡化問題我們認為調用者已經知道了數據庫的名字而直接要求調用這個數據庫
在COM+的類中增加一個私有成員DBName:string用於保存要連接的數據庫名稱還應該提供這樣一個方法來設置它的值我開始是這樣寫的
procedure TmtsDBConnConnectTo(sDBName:string)
begin
try
DBName:=sDBName;
SetComplete;
Except
SetAbort;
end;
end;
然後在其中放入ADOConnectionADODataSet和DataSetProvider控件分別取名為adocadodsdsp設置好它們之間的連接關系把adoc的連接字符串設為連接數據庫DB這是默認值然後在adoc的BeforeConnect事件中
adocConnectionString:=ConnectStringA+´Initial Catalog=´+DBName+´;´+ConnectStringC;
這裡的ConnectStringA和ConnectStringC是為了動態構建連接字符串預先設置好的字符串常量如下
const
ConnectStringA=´Provider=SQLOLEDB;Password=;Persist Security Info=True;User ID=sa;´;
ConnectStringB=´Initial Catalog=DB;´;
ConnectStringC=´Data Source=server;Use Procedure for Prepare=;Auto Translate=True;Packet Size=;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事件中
DcomconnectionConnected:=true;
DcomconnectionAppServerconnect(´DB´);
ClientDatasetActive:=true;
DcomconnectionConnected:=false;
這段代碼是想測試一下能不能訪問到DB數據庫的數據可是結果是點下按鈕時總是報錯這是什麼原因呢?
[] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/24837.html