com+调试与事务的问题?(100分)

L

LQiong

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手请帮个忙:
我现在运行的环境是WIN2000+DELHPI6,我编写了一个利用COM+来实现数据的存取,
其程序结构是数据模块、协调模块、客户端,来实现从SQL2000中提取EMPLOYEE信息,
我完全按照李维书中的说明对之进行调试,可是当我在组件服务中将我的COM+应用程序
的允许调试的选项勾选后,再欲启动之时总是启动失败,到事件查看器中了解到
“服务器 {0A53F1D5-AEE7-4E2D-A036-BAC1A0A919B0} 没有在限定的时间内用 DCOM 注册。”
不知如何解决。
另外我是利用COM+与MIDAS结合实现对数据的更改,我完全按照李维书中方法来设置模块
的事物属性,即数据模块设为支持事务协调模块中起更改作用的模块为需要事务,起获取数据
作用的模块为支持事务,客户端调用协调模块来实现数据的获取和更改可当我进行数据更改时
总是提示:“根事务要提交,但事务终止了操作”。这是为什么请高手帮我指点.谢谢
 
我曾遇到过类似“根事务要提交,但事务终止了操作”问题,后发现是调用的存储过程中
执行了事务提交语句;
不知你是否调用了?或者你在一个事务中,调用了另-个事务的提交,而改事务有要回滚时,
提示改信息!
 
我在程序中用的是TRANSACTION MODULE及TRANSACTION OBJECT,事务我在属性中设置
我没有在程序中控制,TRANSACTION MODULE我用的是支持事务,TRANSACTION OBJECT
我用的是需要事务。
 
把数据模块做成一般的自动化对象
注册为com+
在组件服务里设置其事务特性
 
我就是这么做的
 
我通过调试跟踪发现客户端数据传到中间件是出现如下提示:“project dllhost.exe raise
exception class EdatabaseError with message "Invalid data packet"”,这是否是DELPHI6
中MIDAS存在BUG的原因。
procedure TForm1.Button2Click(Sender: TObject);
var
Imyupdateemp:Iupdateemployee;
vdata:OleVariant;
errorcount:integer;
begin
Imyupdateemp:=Coupdateemployee.Create;
vdata:=clientdataset1.Delta;
Imyupdateemp.Mupdate(vdata,0,errorcount);
end;
中间件:
procedure Tupdateemployee.Mupdate(vdata: OleVariant;
imaxerror: Integer;
var Ierrorcount: Integer);
begin
try
fmydm.DCOMConnection1.AppServer.updatedatas(vdata,imaxerror,Ierrorcount);
setcomplete;
except
setabort;
end;
end;
 
否,你现在的数据对象是TMtsDataModule
从TDataModule继承出来的
改成Automation object
即TAutoObject,从TComObject继承
可能会好一些
 
我如何将数据对象TMtsDataModule改为tautoobject?
 
建立数据对象的时候选Automation object
 
我发现delphi6当我用客户端应用程序直接调用COM+组件实现对SQL2000数据库的更改没有问题,可
一旦通过协调模块(COM+组件)调用数据模块(COM+组件),实现对SQL2000数据库的更改,就出问题,我将协调模块
的事务属性设为需要事务,数据模块设为支持事务。(我的环境是D6+WIN2000+SQL2000)
 
李维《ado/mts/com+》第九章中的例子MIDAS+MTS实现对数据的更新,将单元COMOBJ.PAS和
provider.pas进行修改,可将这个例子搬到DELPHI6的环境下就不能正常工作.这是为什么?
 
关于 ( LQiong
我发现delphi6当我用客户端应用程序直接调用COM+组件实现对SQL2000数据库的更改没有问题,可
一旦通过协调模块(COM+组件)调用数据模块(COM+组件),实现对SQL2000数据库的更改,就出问题,我将协调模块
的事务属性设为需要事务,数据模块设为支持事务。(我的环境是D6+WIN2000+SQL2000)
)
应将协调模块
的事务属性设为支持事务;
 
如将协调模块改为支持事务,是没有错误提示了,可是数据根本就没有被改动。
这我试过多次了。
 
你的基本组件应引发事务,在其调用的其它组件(支持事务)就会继承它的事务;我都是这么做的,
我从不用需要事务,在需要事务时,在基本组件处用代码控制,很灵活,提交数据没问题,不知你的协调对象的
具体情况;
 
这种情况显然是你的数据组件自行提交事务引起的
从另一个方面来看
这种系统结构是否合适?
由于根事务在协调组件中启动,这个事务的粒度是非常粗的
对于同时存取不同的数据库,这样做或许有些意义
但是对于后台只有一个数据库的系统,就毫无必要了
 
xj_lq:
我按你说的用代码来控制事务的激发提交数据确实不再出现问题。但我想了解我
原先的结构为什么会异常。我原先的结构是:中间件中包含一DATAMODAL,在其中放
置DCOMCONNECTION控件实现与数据模块的连接,然后再定义一Mupdate方法。
procedure Tupdateemployee.Mupdate(vdata: OleVariant;
imaxerror: Integer;
var Ierrorcount: Integer);
begin
try
fmydm.DCOMConnection1.AppServer.updatedatas(vdata,imaxerror,Ierrorcount);
setcomplete;
except
setabort;
end;
end;
并将中间件的事务模型设为需要事务,结果就出现了问题。(环境:D6+WIN2000+SQL2000)
 
关注!!不懂就多听听!!也是好事!!~~~~
 
顶部