其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

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


发布日期:2023年07月09日
 
在Delphi中如何维护COM+的状态信息[2]

回到COM+的工程调试它在ConnectTo和adocBeforeConnect中设置断点发现程序执行到

DBName:=sDBName;

确实已经把DBName的值设为DB但是在执行

adocConnectionString:=ConnectStringA+´Initial Catalog=´+DBName+´;´+ConnectStringC;

DBName又成了空字符串所以出错了

为什么DBName的值会丢掉呢?原来在是因为在ConnectTo中调用了SetComplete方法SetComplete方法认为这个COM+已经完成了任务会释放这个COM+对象所以连接数据库时又创建了一个新的COM+它的DBName当然是空值了

找到了原因把SetComplete改成EnableCommit; 编译再运行客户端终于运行成功取回了DB数据库中的数据

可是在客户端程序中放入另一个ClientDataSet在打开ClientDataSet之后打开ClientDataSet想继续访问DB中的数据又报错了把程序改成

DcomconnectionAppServerconnect(´DB´);

ClientDatasetActive:=true;

ClientDatasetActive:=false;

ClientDatasetActive:=true;

即使只使用一个ClientDataSet在它关闭之后再打开时依然会出错

但如果客户端写成

DcomconnectionAppServerconnect(´DB´);

ClientDatasetActive:=true;

DcomconnectionAppServerconnect(´DB´);

ClientDatasetActive:=true;

可以执行成功但这样似乎很不好看COM+为什么会在连接完数据库后又把自己释放呢?

原来TmtsDataModule有一个AutoComplete属性默认值是true所以在连接完数据库之后它还是会把自己释放

把AutoComlete设成false后还是出错在COM+的OnActivate事件中跟蹤发现当它被激活时AutoComplete属性被自动设为ture了所以在它第一次连接数据库后依然会把自己释放

在COM+的OnOnActivate事件中写上

AutoComplete:=false;

客户端一次连接多次访问数据库也没有问题了

但这样一来COM+就不会自动释放了需要在COM+中增加一个方法在这个方法中SetComplete然后在客户端用完COM+后调用这个方法来释放COM+

经过以上的摸索得出以下的结论在COM+中如果要保持状态信息需要做一些工作因为COM+默认是无状态的它每次被客户端调用后都会判断是不是应该释放自己如果我们不想它释放就要人工加以干预最后我们还要人工去释放它

[] []

               

上一篇:Delphi开发基于DCOM的聊天室

下一篇:在Delphi中如何维护COM+的状态信息[1]