关于MTS事务!(50分)

  • 主题发起人 主题发起人 Dephic
  • 开始时间 开始时间
D

Dephic

Unregistered / Unconfirmed
GUEST, unregistred user!
底层MTS数据模块和应用MTS模块只要其中一个设为须要事务就没法
成功提交数据,但没出错,可能模块自己执行RollBack了,怎么办?
 

后来我曾试把这个 vStudentResultTypeUpdateDM.Free ;
屏蔽掉,不让它释放,但结果还是一样!哎~~~~
哪位大虾帮解决了,200分送上!
 
从你的代码来看,没有问题,不过你没有贴全,不知道是不是别的代码有问题。
你全部帖出来看看。
 
这是这个PAS全部的代码了,这是应用层MTS模块,:
unit StudentResultTypeUpdate_U_WDQ;
interface
uses
ActiveX, MtsObj, Mtx, ComObj, StudentResultTypeUpdate_P_WDQ_TLB, StdVcl,
StudentResultTypeUpdateDM_U_WDQ, Forms, classes, Sysutils;
type
TStudentResultTypeUpdate = class(TMtsAutoObject, IStudentResultTypeUpdate)
private
vStudentResultTypeUpdateDM : TStudentResultTypeUpdateDM;
protected
function SetStudentResultType(const Delta: WideString): Integer;
safecall;
{ Protected declarations }
public
procedure Initialize;
override;
destructor Destroy;
override;
end;

implementation
uses ComServ;
procedure TStudentResultTypeUpdate.Initialize;//初始化数据模块
begin
inherited;
vStudentResultTypeUpdateDM := TStudentResultTypeUpdateDM.Create(Forms.Application);
end;

destructor TStudentResultTypeUpdate.Destroy;
begin
inherited;
vStudentResultTypeUpdateDM.Free ;//vStudentResultTypeUpdateDM为数据模块TDataMoudle名称
end;
//跟踪到这出错,出错内容:根事务要提交,但事务已经被终止!
//不知如何解决?

function TStudentResultTypeUpdate.SetStudentResultType(
const Delta: WideString): Integer;
var
ErrorCount : integer;
begin
try
vStudentResultTypeUpdateDM.xmlbStudentResultType.Connected := true;//xmlbStudentResultType : TXMLBroker
vStudentResultTypeUpdateDM.xmlbStudentResultType.ApplyXMLUpdates(Delta,ErrorCount);//XMLBroker执行数据提交方法
Result := ErrorCount;//返回出错数目
vStudentResultTypeUpdateDM.xmlbStudentResultType.Connected := false;//关闭和数据库的连接
SetComplete;//不知道是不是应该在此提交事务?
except
SetAbort;
end;
end;
initialization
TAutoObjectFactory.Create(ComServer, TStudentResultTypeUpdate, Class_StudentResultTypeUpdate,
ciMultiInstance, tmApartment);
end.

在这层还有一个数据模块,代码如下:
unit StudentResultTypeUpdateDM_U_WDQ;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
XMLBrokr, Db, DBClient, MConnect;
type
TStudentResultTypeUpdateDM = class(TDataModule)
dcomcStudentResultType: TDCOMConnection;//用于连接底层MTS数据模块
xmlbStudentResultType: TXMLBroker;//连接至底层MTS数据模块的数据提供控件TDataSetProvider
private
{ Private declarations }
public
{ Public declarations }
end;

var
StudentResultTypeUpdateDM: TStudentResultTypeUpdateDM;
implementation
{$R *.DFM}
end.

底层的MTS数据模块完全只是进行数据连接,没写任何代码!
 
to caidaoli,
我已经把全部代码贴到上面了!
 
不可能哦。我一直这样做是OK的啊?你是否在哪儿设置有问题啊。
 
to liaotw,
不知你是不是也是B/S的事务?还是C/S的?不过原理上应该是一样的!
如果也是b/s,能不能说说你的设置?
 
我也出现过这种情况。没法解决。我重新写一次,好啦!你要不试试?
 
to jswqg:
我是分开很多个COM+模块的,每个都一样,所以应该是方法上的错误!并不是偶然的。
但不知道是哪里错了!哎~~~
 
分开后,就要看看你的设置。如何调用。
 
我真不知道是错哪了,这么久来都没法启用事务来管理!哎~~~~
哪位大虾帮忙解决了,一定送上300分决不失言!
 
最好是WIN2000,数据库为SQL、为ORacle时,要更改配置。
 
我的系统就是win2000+sql server2000+delphi5用ADO(打过补丁的,两个补丁包都打上了)
 
destructor TStudentResultTypeUpdate.Destroy;
begin
inherited;
vStudentResultTypeUpdateDM.Free ;//vStudentResultTypeUpdateDM为数据模块TDataMoudle名称
end;
//两句语句应该对换位置;
如果不行的话,建议你在MTS的OnActive..中建立、取消MTS数据模块。
再好一点的话,不要使用DCOM来连接MTS数据模块。因为DELPHI5中的DCOMconnection还不能真正地加入到MTS/COM+的交易控制中去。
建议你直接用ObjectContext来设立MTS数据模块。
你提交事务的时机应该是合适的。
 
注意: 直接用ObjectContext来设立MTS数据模块.
与是否使用DCOMConnection无关,
 
>>vStudentResultTypeUpdateDM.xmlbStudentResultType.Connected := false;//关闭和数据库的连接
>>SetComplete;//不知道是不是应该在此提交事务?
你已经关闭了与数据库的连接,如何“SetComplete”???
把两个语句对调试试。
 
谢谢各位,我这段时间没时间去试!可能是像间接点球说的!试成再后上来给分!
 
多人接受答案了。
 
后退
顶部