F
Fox2008
Unregistered / Unconfirmed
GUEST, unregistred user!
正在设计COM+的架构,我是根据李维大师推荐的利用协调对象的方式处理的,即有以下模块:
1.连接SQL SERVER数据库的数据模块组件,设为"支持事务",在组件中加入了查询以及更新主从表的代码,部分代码如下:
//查询
function TMtsDataBase.GetTableDesc(const Db, Sql: WideString;
var vDatas: OleVariant): WideString;
begin
try
try
AdcDataBase.DefaultDatabase:=Db;
AdsTableDesc.Connection:=AdcDataBase;
AdsTableDesc.Close;
AdsTableDesc.CommandText:='';
AdsTableDesc.CommandText:=Sql;
AdsTableDesc.Open;
vDatas:=DspTableDesc.Data;
if AdsTableDesc.IsEmpty then
Result:='GET_NOREC'
else
Result:='GET_SUCCESS';
SetComplete;
except
Result:='GET_FAILD';
SetAbort;
end;
finally
AdsTableDesc.Close;
end;
end;
//更新
function TMtsDataBase.UpdateDataBase(const Db: WideString;
var vDatasTableDesc, vDatasFieldDesc: OleVariant): WideString;
var
intErrCount:Integer;
begin
DefaultDb:=Db;
try
if Not VarISNull(vDatasTableDesc) then
begin
vDatasTableDesc:=DspTableDesc.ApplyUpdates(vDatasTableDesc,0,IntErrCount);
if intErrCount > 0 then
begin
result := 'UPDATE_MASTERFAILED';
SysUtils.Abort;
end;
end;
if Not VarISNull(vDatasFieldDesc) then
begin
vDatasFieldDesc:=DspFieldDesc.ApplyUpdates(vDatasFieldDesc,0,IntErrCount);
if intErrCount > 0 then
begin
result := 'UPDATE_DETAILFAILED';
SysUtils.Abort;
end;
end;
Result:='UPDATE_SUCCESS';
SetComplete;
Except
on Exceptiondo
SetAbort;
end;
end;
2,查询协调对象,设为"支持事务",利用接口调用的方式调用组件1的查询方法,代码如下:
function TDataQueryObj.GetTableDescCoor(const strDb, strSql: WideString;
var vaDatas: OleVariant): WideString;
var
MtsDataBaseObj:IMtsDataBase;
begin
try
OleCheck(ObjectContext.CreateInstance(CLASS_MtsDataBase,IID_IMtsDataBase,MtsDataBaseObj));
Result:=MtsDataBaseObj.GetTableDesc(strDb,strSql,vaDatas);
SetComplete;
Except
Result:='GET_FAILD_COOR';
SetAbort;
end;
end;
3,更新协调对象,设为"需要事务"方式,利用接口调用的方式调用组件1的更新方法,代码如下:
function TDataUpdateObj.UpdateDataBaseCoor(const strDb: WideString;
var vDataTableDesc, vDataFieldDesc: OleVariant): WideString;
var
MtsDataBaseObj:IMtsDataBase;
begin
try
OleCheck(ObjectContext.CreateInstance(CLASS_MtsDataBase,IID_IMtsDataBase,MtsDataBaseObj));
Result:=MtsDataBaseObj.UpdateDataBase(strDb,vDataTableDesc,vDataFieldDesc);
if Result='UPDATE_SUCCESS' then
SetComplete
else
SetAbort;
Except
on Exceptiondo
begin
Result:='UPDATE_FAILD_COOR';
SetAbort;
end;
end;
end;
4,前台:前台调用时一切正常,查询,新增保存都可以,事务也有控制,
[blue]
但是删除时有问题,我是这样处理:
在主表的删除触发器中写入删除从表的代码,前台只删除主表,代码如下:
CREATE TRIGGER TableDesc_Del ON [dbo].[t_TableDescription]
FOR DELETE
AS
declare @TableID int
Select @TableID=FTableID From Deleted
--Delete From t_FieldDescription where FTableID=@TableID
if @@error<>0
begin
Rollback Tran
raiserror('出错!',-999,1)
END
[/blue]
[red]
最终问题:
删除,主表执行保存时出现:"没有活动事务"的错误,跟踪事务发现主表执行保存后事务就被中止了,请问如何解决?触发器是不是把事务一起提交了?当在触发器写入其他一些如查询计算的代码时却没有错误,何解?
[/red]
1.连接SQL SERVER数据库的数据模块组件,设为"支持事务",在组件中加入了查询以及更新主从表的代码,部分代码如下:
//查询
function TMtsDataBase.GetTableDesc(const Db, Sql: WideString;
var vDatas: OleVariant): WideString;
begin
try
try
AdcDataBase.DefaultDatabase:=Db;
AdsTableDesc.Connection:=AdcDataBase;
AdsTableDesc.Close;
AdsTableDesc.CommandText:='';
AdsTableDesc.CommandText:=Sql;
AdsTableDesc.Open;
vDatas:=DspTableDesc.Data;
if AdsTableDesc.IsEmpty then
Result:='GET_NOREC'
else
Result:='GET_SUCCESS';
SetComplete;
except
Result:='GET_FAILD';
SetAbort;
end;
finally
AdsTableDesc.Close;
end;
end;
//更新
function TMtsDataBase.UpdateDataBase(const Db: WideString;
var vDatasTableDesc, vDatasFieldDesc: OleVariant): WideString;
var
intErrCount:Integer;
begin
DefaultDb:=Db;
try
if Not VarISNull(vDatasTableDesc) then
begin
vDatasTableDesc:=DspTableDesc.ApplyUpdates(vDatasTableDesc,0,IntErrCount);
if intErrCount > 0 then
begin
result := 'UPDATE_MASTERFAILED';
SysUtils.Abort;
end;
end;
if Not VarISNull(vDatasFieldDesc) then
begin
vDatasFieldDesc:=DspFieldDesc.ApplyUpdates(vDatasFieldDesc,0,IntErrCount);
if intErrCount > 0 then
begin
result := 'UPDATE_DETAILFAILED';
SysUtils.Abort;
end;
end;
Result:='UPDATE_SUCCESS';
SetComplete;
Except
on Exceptiondo
SetAbort;
end;
end;
2,查询协调对象,设为"支持事务",利用接口调用的方式调用组件1的查询方法,代码如下:
function TDataQueryObj.GetTableDescCoor(const strDb, strSql: WideString;
var vaDatas: OleVariant): WideString;
var
MtsDataBaseObj:IMtsDataBase;
begin
try
OleCheck(ObjectContext.CreateInstance(CLASS_MtsDataBase,IID_IMtsDataBase,MtsDataBaseObj));
Result:=MtsDataBaseObj.GetTableDesc(strDb,strSql,vaDatas);
SetComplete;
Except
Result:='GET_FAILD_COOR';
SetAbort;
end;
end;
3,更新协调对象,设为"需要事务"方式,利用接口调用的方式调用组件1的更新方法,代码如下:
function TDataUpdateObj.UpdateDataBaseCoor(const strDb: WideString;
var vDataTableDesc, vDataFieldDesc: OleVariant): WideString;
var
MtsDataBaseObj:IMtsDataBase;
begin
try
OleCheck(ObjectContext.CreateInstance(CLASS_MtsDataBase,IID_IMtsDataBase,MtsDataBaseObj));
Result:=MtsDataBaseObj.UpdateDataBase(strDb,vDataTableDesc,vDataFieldDesc);
if Result='UPDATE_SUCCESS' then
SetComplete
else
SetAbort;
Except
on Exceptiondo
begin
Result:='UPDATE_FAILD_COOR';
SetAbort;
end;
end;
end;
4,前台:前台调用时一切正常,查询,新增保存都可以,事务也有控制,
[blue]
但是删除时有问题,我是这样处理:
在主表的删除触发器中写入删除从表的代码,前台只删除主表,代码如下:
CREATE TRIGGER TableDesc_Del ON [dbo].[t_TableDescription]
FOR DELETE
AS
declare @TableID int
Select @TableID=FTableID From Deleted
--Delete From t_FieldDescription where FTableID=@TableID
if @@error<>0
begin
Rollback Tran
raiserror('出错!',-999,1)
END
[/blue]
[red]
最终问题:
删除,主表执行保存时出现:"没有活动事务"的错误,跟踪事务发现主表执行保存后事务就被中止了,请问如何解决?触发器是不是把事务一起提交了?当在触发器写入其他一些如查询计算的代码时却没有错误,何解?
[/red]