COM+中事务处理 (100分)

  • 主题发起人 主题发起人 我真的是青蛙
  • 开始时间 开始时间

我真的是青蛙

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是一个COM+服务器里的审核方法。COM+为需要事务模式。
以下这个方法必须要保证在同一个事务里,其中任何 项失败或出错都要回滚。
可是下面这代码为什么不能回滚事务???
function TLYSVR.BuyInCheck(var Param: OleVariant;
TypeFlag: WordBool): OleVariant;
var
s:string;
TmpQry:TMySQLQuery;
tmparray:array of Variant;
i:integer;
begin
result:='';
if TypeFlag then
s:='+' else
s:='-';
TmpQry:=CreateQuery(false);
try
try
if varisarray(param) then
begin
tmparray:=param;
for i:=0 to high(tmparray)do
begin
if tmparray[3]<>'' then
begin
if TmpQry.Active then
TmpQry.Close ;
TmpQry.SQL.Clear ;
TmpQry.SQL.Add('select joh_bill from j_oorder_h where joh_checked=1 and joh_bill='+#39+tmparray[3]+#39);
TmpQry.Open ;
if TmpQry.IsEmpty then
begin
result:='订货单号:'+tmparray[3]+'不存在或没有审核';
raise Exception.Create('Error');
end else
begin
//更新该订货单中的完成数量
if TmpQry.Active then
TmpQry.Close ;
TmpQry.SQL.Clear ;
TmpQry.SQL.Add('select * from j_oorder_d where jod_pno='+#39+tmparray[0]+#39+
' and jod_brand='+#39+tmparray[1]+#39+' and jod_bill='+#39+
tmparray[3]+#39 );
TmpQry.Open ;
if TmpQry.IsEmpty then
begin
result:='产品:'+tmparray[0]+',品牌'+tmparray[1]+'在订货单'+
tmparray[3]+'中没有找到';
raise Exception.Create('Error');//是不是此处自定义错误,不能使事务回滚????????
end else
begin
//开始更新该订货单中的完成数量
TmpQry.Close ;
TmpQry.SQL.Clear ;
TmpQry.SQL.Add('update j_oorder_d set jod_finishcount=jod_finishcount'+s+inttostr(tmparray[2])+
' where jod_bill='+#39+tmparray[3]+#39+' and jod_pno='+#39+
tmparray[0]+#39+' and jod_brand='+#39+tmparray[1]+#39);
TmpQry.ExecSQL;
end;
end;
end;
//更新订货单完成,以下开始更新库存中的总数量与现货数量 以及成本价
if TmpQry.Active then
TmpQry.Close ;
TmpQry.SQL.Clear ;
TmpQry.SQL.Add('update proinfo set strcount=strcount'+s+inttostr(tmparray[2])+
',xhcount=xhcount'+s+inttostr(tmparray[2])+
',inprice=(strcount*inprice'+s+inttostr(tmparray[4])+
')/(strcount'+s+inttostr(tmparray[2])+')'+
' where '+
' pro_no='+#39+tmparray[0]+#39+' and pro_brand='+#39+tmparray[1]+#39);
TmpQry.ExecSql;
end;
end;
setComplete;
except
result:=result+'.审核失败';
SetAbort;
end;
finally
if TmpQry.Active then
TmpQry.Close ;
TmpQry.Free ;
end;

end;
 
我也遇到過相同的情況.
問題在這:
except
result:=result+'.审核失败';
SetAbort;
end;
應該為:
except
SetAbort;
result:=result+'.审核失败';
end;
 
不会吧,是这个问题???
我测试一下,如果是的话,100分全给你。
 
来自:[red]blank>[/red]我真的是青蛙, 时间:2003-620 11:35:00, ID:1968036 | blank>编辑
不会吧,是这个问题???
我测试一下,如果是的话,100分全给你。
这个blank是什么??????
我上面的代码怎么多了下划线???
 
hcm0790兄弟,不对呀,我改了还是不行呀
 
老兄啊,你比我还高,真惭愧帮不上你的忙。
 
同意SEVN,
》》老兄啊,你比我还高,真惭愧帮不上你的忙。
 
晕了晕了,
上面的代码变乱了,可能是DFW的问题,我改一下
 
靠,DFW是不是被黑了???
我上面贴的代码怎么少了那么多“+”号,而且莫名其妙多了下划线
 
水平有限 帮你顶一下~
 
兄弟,可能是吧,我这里经常看不到任何东西
 
我看一切正常啊,只是好像代码本身看不出问题吧,不过我没玩过三层,看不出你是何时启
动事务的啊?
 
try to use database transaction instead of com+ transaction
use rollback or commit.
 
我看还是自己管理事务吧:
1.设为支持事务模式.
2.自己启动事务.
var
FTransactionContextEx:ITransactionContextEx;
begin
if not IsInTransaction then
begin
FTransactionContextEx:=CreateTransactionContextEx;
try
...写上你的更新代码
OleCheck(FTransactionContextEx.Commit);
SetComplete;
except
on Exceptiondo

begin
OleCheck(FTransactionContextEx.Abort);
SetAbort;
raise;
end;
end;
end;

 
没有搞过com+
真惭愧帮不上你的忙。
 
事务还是交给SQL Server的存储过程去做吧!
 
TO:yyanghhong,cxz9
MTS中已经有很好的事务机制,何必还用上ADO或DBX中的事务处理呢。
我想是我的代码或者其它的问题,MTS肯定能实现这种事务的。
交给存储过程去做???实现我要的那种也太麻烦了,
 
我估计是某种其它原因,使得事务没有启动.按我说的做吧,保你没事.
 
自我描述:
。。。。。
数据库的问题别找我,我比较菜。问老千比较好,呵呵:)
 
后退
顶部