萧
萧月禾
Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi中,利用Try...Except或Try...Finally可以很方便地对程序代码进行异常处理,
当程序出错时自动跳转执行Except或Finally后的代码。而在Sql的存储过程中,
似乎未提供类似的内容。
在存储过程中,通常是通过判断@@Errors的值(为0表示正确)来知道上一个执行结果
是否发生了错误,这样有着其不便的地方。
1、@@Errors是表示其上一个操作结果的错误
如:
Insert ...
print @@Errors --表示Insert操作的错误
Delete...
print @@Errors --表示Delete操作的错误
则不能在一系列的操作后,根据@@Errors判断当中有无发生错误
于是采用2种方法:
第一是用一布尔变量,初值为False,在每条操作语句后,判断当前@@Errors的值,
如果@@Errors不等于0,则给其赋值True,否则不更改其值,最后判断这个变量,
如果为True,则表示以上操作中曾发生过错误。然后给予提示或事务回滚。
第二是采用Goto的方法,在每条操作语句后,判断当前@@Errors的值,
如果@@Errors不等于0,则Goto到(sql)程序的最后。然后给予提示或事务回滚。
感觉这2种方式都不太好,不知道大家有没有更好的方法。
这还是直接在Sql中执行的,如果是在Delphi中调用这个存储过程,则引出下一个问题......
2、系统错误立即响应
如:
Insert ...
if ( @@Errors <> 0 )
raiseerror('发生错误...')
原本是向在Insert操作发生错误的时候,返回自定义提示,
然如果该存储过程是在Delphi或其他开发工具的程序中调用,
则在执行Insert时一旦发生错误,立即响应系统错误,
不会执行下一句,即raiseerror完全不起作用。
请问有没有办法自己控制异常的响应?或者sql中有没有这样的一个开关,
可以设置sql执行中发生错误不自动响应,
而是自己在程序中根据@@Error的值做相应的判断和处理?
这些问题主要针对Sql Server2000
或者大家平时在前台程序中嵌套调用存储过程的时候对错误处理有没有比较好的办法?
还望各位指点一二!
(当然,也可以直接在Delphi程序中做异常处理,但如果要做相应的修改,
则需要重新给客户安装一个个程序,直接在存储过程中做比较方便。
另外,如果不是必要,也不打算使用三层结构。)
当程序出错时自动跳转执行Except或Finally后的代码。而在Sql的存储过程中,
似乎未提供类似的内容。
在存储过程中,通常是通过判断@@Errors的值(为0表示正确)来知道上一个执行结果
是否发生了错误,这样有着其不便的地方。
1、@@Errors是表示其上一个操作结果的错误
如:
Insert ...
print @@Errors --表示Insert操作的错误
Delete...
print @@Errors --表示Delete操作的错误
则不能在一系列的操作后,根据@@Errors判断当中有无发生错误
于是采用2种方法:
第一是用一布尔变量,初值为False,在每条操作语句后,判断当前@@Errors的值,
如果@@Errors不等于0,则给其赋值True,否则不更改其值,最后判断这个变量,
如果为True,则表示以上操作中曾发生过错误。然后给予提示或事务回滚。
第二是采用Goto的方法,在每条操作语句后,判断当前@@Errors的值,
如果@@Errors不等于0,则Goto到(sql)程序的最后。然后给予提示或事务回滚。
感觉这2种方式都不太好,不知道大家有没有更好的方法。
这还是直接在Sql中执行的,如果是在Delphi中调用这个存储过程,则引出下一个问题......
2、系统错误立即响应
如:
Insert ...
if ( @@Errors <> 0 )
raiseerror('发生错误...')
原本是向在Insert操作发生错误的时候,返回自定义提示,
然如果该存储过程是在Delphi或其他开发工具的程序中调用,
则在执行Insert时一旦发生错误,立即响应系统错误,
不会执行下一句,即raiseerror完全不起作用。
请问有没有办法自己控制异常的响应?或者sql中有没有这样的一个开关,
可以设置sql执行中发生错误不自动响应,
而是自己在程序中根据@@Error的值做相应的判断和处理?
这些问题主要针对Sql Server2000
或者大家平时在前台程序中嵌套调用存储过程的时候对错误处理有没有比较好的办法?
还望各位指点一二!
(当然,也可以直接在Delphi程序中做异常处理,但如果要做相应的修改,
则需要重新给客户安装一个个程序,直接在存储过程中做比较方便。
另外,如果不是必要,也不打算使用三层结构。)