再问关于SQL中的错误处理的问题(300分)

  • 主题发起人 萧月禾
  • 开始时间
RAISEERROR就是手动引发错误啊,你的错误级别也是设置够了的,
不过既然被TRY了应该转到前台报错吧,我没做过实验,如果同时
前台后台都写,会怎么样我也不知道。但是不建议本身无错而去引发
如果检测表数据存不存在最好用参数返回,还有出错级别再设置高点
你看看有什么不同,我觉得16已经够了。我现在没装SQLSERVER没法
帮你实验,把前台抱错和后台写不一样,看看是怎么回事情。
我推理是这样的 捕捉错误写在前台,那么后台如果有错误,也就是一执行RAISEERROR
那么被你 TRY语句捕获 RAISEERROR的抱错就被捕捉了,而转为你前台的 SHOWMESSAGE
还有如果什么报错都没有,检查是不是真的执行了RAISEERROR 你干脆把IF 条件去掉
直接写RAISEERROR做个实验。

以下这个随意拿到存储过程都可以用,我建议把事务和报错都写在后台。
这样前台的代码就简单些。而且效率也高,SQLSERVER的出错号可以
由@@error来返回。

begin tran
。。。
你的具体SQL 语句
。。。
if @@error>0
begin
rollback
raiserror('出错信息',16,1)
return
end
else
commit tran
GO
 
我认为要获得服务器端的传回的错误信息,还有一个简单的方法:在存储过程中定义一个
输出参数。如 @ReStr char(20) output.
create procedure aa (@name char(20),@ReStr char(20) output)
as
begin tran
update table
if @@error<>0
set @ReStr='数据更新失败'
else
if @@error=0
set @restr='数据更新成功'
通过客户端执行该存储过程后取得@ReStr得值

 
set nocount on + 事务 <<Sql Server 2000高级编程技术>>里的存储过程都里处处可见
 
我以前也遇到过这样的问题,不过由于赶项目时间,没有仔细研究解决,而是在Delphi中
进行了控制。同样希望能有好的解决办法!
严重关注。
 
TO:萧大侠
RaiseError用于返回用户自定义的错误信息,应该没有问题。
如果先执行了Update...Set...,这句话执行是否正常呢?
如果执行正常,那RaiseError一定会返回错误;而如果Update...Set...
本身执行不正常,则数据库系统会引发异常,并中断存储过程的执行,
那后面的if exists(select * from t_table_name)
raiserror('TEST!',16,1)
当然就不会执行了。
关于如何处理数据库存储过程抛出的异常,可参考我在以下问题
中的答贴:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1612444
 
主要是exists 搞得怪,即使你那个返回null exists也返回true
你应该 if (select object_id(tablename)from ....) >0
raiserror()
 
多人接受答案了。
 
顶部