问题是这样开始的我需要写一个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 forData=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数据库的数据可是结果是点下按钮时总是报错这是什么原因呢?
[] []