delphi怎么捕捉SQLServer 2000存储过程或触发器没执行成功的异常?(100)

  • 主题发起人 主题发起人 _yzy_
  • 开始时间 开始时间
Y

_yzy_

Unregistered / Unconfirmed
GUEST, unregistred user!
在执行一个存储过程的时候,如果存储过程发生错误,或存储过程执行成功但所影响的触发器由于约束或别的原因没有执行成功,整个存储过程会生成回滚,但用try except end 结构捕捉不到异常。难道在触发器或存储过程中还要设置什么异常返回吗?DM.ACN.BeginTrans; try DM.ACN.Execute('exec SP_Input 23'); //调用存储过程 DM.ACN.CommitTrans; //如果事务执行不成功会回滚,但不触发Except,而是继续执行下面的过帐成功信息 MSB(由于以下原因过帐成功!,2); ..... except on E:exception do begin DM.ACN.RollbackTrans; MSB('由于以下原因过帐失败!'+#10+#13+E.Message,2); end; end;上面DM和ACN的定义: TDM = class(TDataModule) ACN: TADOConnection;-------------------------示例触发器:Create Trigger ReportedLossList_TR on ReportedLossListfor insert,update,deleteas UPDATE RawMaterials_T SET BQBS=(SELECT ISNULL(SUM(R_Number),0) FROM ReportedLossList Where (R_ID=RawMaterials_T.R_ID) AND (Sell_Date>ISNUll(RawMaterials_T.PDDate,'1900-01-01 00:00:00')) AND (Del_Flag='0')) UPDATE RawMaterials_T SET BQZC=SQKC+(BQGJ-BQInTH)-(BQSell-BQSellTh)-BQBSGO
 
在SQL脚本中通过@@ERROR变量判断是否需要提交事务。不放在前台执行?
 
存储过程在前台执行,但出错的话不能通过try except end来捕捉到。在触发器或存储过程中用@@ERROR变量的话能否详细说说。
 
抄袭一下master数据库中的sp_Msaddexecarticle的代码,你就可以看明白了: SELECT @article_id = @@IDENTITY select @cmd = 'UPDATE sysobjects SET ' + @sysobj_colname select @cmd = @cmd + ' = ' + @sysobj_colname + ' | ' + CONVERT( nvarchar, @publish_bit ) select @cmd = @cmd + ' WHERE id = (SELECT objid FROM sysarticles WHERE name = ''' select @cmd = @cmd + @article + ''' and pubid = ' + CONVERT( nvarchar, @pubid ) + ')' EXEC (@cmd) IF @@ERROR <> 0 BEGIN if @@trancount > 0 begin ROLLBACK TRAN sp_MSaddexecarticle commit tran end RETURN (1) END-----------------------
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
659
import
I
后退
顶部