如何在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又成了空字符串,所以出错了。

时间: 2024-08-01 09:10:58

如何在Delphi中维护COM+的状态信息的相关文章

如何在Delphi中调用VC6.0开发的COM

上次写了如何在VC6.0下对Delphi写的COM进行调用,原本想马上写如何在Delphi中调用VC6.0开发的COM时,由于在写事例程序中碰到了个很怪的问题,在我机子上用VC写的接口程序编译能通过.但是调用就会出现问题,(在VC下调用也是一样的出现).但是用Delphi写的接口程序编译后,不管是在VC下还是在Delphi下调用都没有问题.后来我把VC开发的接口程序编译后,拷贝到其它机子上试,怪事,完全没有问题了.总结后才知道是我机子有点问题.我到现在还没有解决为什么在我的机子上不行,在其它机子

如何在Android中捕获cocos的崩溃信息

问题描述 如何在Android中捕获cocos的崩溃信息 需要手机Android项目中的崩溃信息到文件中,然后上传服务器.我现在知道怎么收集Android的崩溃信息到文件中,也知道如何上传服务器.但是我的项目中有cocos的代码,我怎么能收集到cocos的崩溃信息呢? 我看过http://www.cnblogs.com/lancidie/archive/2013/04/13/3019349.html这里面的内容,想试着做出来,但是在把jni部分的代码粘进去以后,出现了很多错误,代码如下: #in

在Delphi中如何维护COM+的状态信息

问题是这样开始的:我需要写一个COM+,用来连接不同的数据库.有的朋友可能会说,应该为每个数据库建立一个COM+,但是在我的系统里不能这样.我们在做一个教育辅助系统,用户是学校(当然包括学校里的老师.学生.家长),我们为每个学校建一个数据库,这些数据库的结构是相同.当然我们还有管理数据库,用于协调各数据库的关系.每增加一个学校用户,我们就激活一个新的数据库给客户使用,也就是说,我们的数据库的个数是不断增加的,而我们的客户端只有一个,我们不会为每个学校开发不同的客户端,我们的COM+也只有一组,而

如何在Delphi中调用oracle的存储过程返回数据集

oracle|存储过程|数据 选自CSDN http://search.csdn.net/Expert/topic/2280/2280860.xml?temp=2.169436E-02 论坛中JCC0128 网友的发言 [delphi+oracle报表解决方案(一)]delphi中调用oracle的存储过程(分带返回游标,不返回值两种)  关键字: delphi ,oracle存储过程,游标,返回数据集,报表 注:delphi 6+ oracle 8.1.6 一.创建包与包体 1.附:建表aac

如何在delphi中使用xml文档

在delphi中使用xml文档有两种方法,一是使用delphi 内置的xml broker:一是使用msxml.dll . 一  使用xml broker, 是delphi 内置的 例: unit ShowXML; interface uses Classes HTTPApp Db DbClient Midas XMLBrokr WebComp MidItems; type TCustomShowXMLButton = class(TXMLButton IScriptComponent) pro

如何在ROR中,如何实现验证信息的中文化

问题描述 我看了几篇帖子,效果都不是很好.有没有比较好的方法.谢谢. 问题补充:<div class="quote_title">夜鸣猪 写道</div><div class="quote_div">喔,你确认你看了NS和虎炮讨论的那篇?<br /><br /><a href="http://www.iteye.com/topic/469505" target="_bla

浅议Delphi中的Windows API调用

为了能在Windows下快速开发应用程序,Delphi对Windows的控件都进行了很好的封装,这样,我们就可以直接使用Delphi的控件来编写程序,而不用使用格式.调用控制复杂的API来进行开发,为我们节省了大量的开发时间. 可有时候这些控件解决不了我们的问题,这个时候我们就不得不使用API了,也就是Windows的应用程序接口.这样,问题也就随之而来了,API是用C++语言编写的,而Delphi的脚本语言是PASCAL,两者使用的数据类型是不兼容了.那么,如何在Delphi中调用数据类型不兼

在Delphi中使用DBF数据

Delphi是美国Inprise 公司开发的功能强大的Windows 应用程序开发工具.她是可视化应用程序开发环境.可重用性面向对象编程语言.快速编译器和数据库技术的完美结合. 由于Delphi具有运行速度快.功能强大.易于学习和使用且开发迅速等特点,并支持XML和HTML,支持 Web 和Internet的开发,一直受到广大用户的喜爱. 国内PC机上使用最普及历史最长的数据库是DBF格式的数据库,即是dBASE II.dBASE III和FoxPro中使用的数据库格式.为了充分利用已有的数据库

简析XML及其在Delphi中的应用

摘要:随着信息化社会的发展和不同系统间数据交换的要求,XML将成为不同系统间数据交换的标准和传输格式.本文结合实例介绍了如何在Delphi中应用XML进行编程的技术. 关键字:可扩展标记语言,Delphi, Web Service, InternetExpress. 1. XML及其背景 XML即Extensible Markup Language(可扩展标记语言)的缩写[1].XML是Web上表示结构化信息的一种标准文本格.XML同HTML一样,都来自SGML(标准通用标记语言).XML与SG