如果抛出异常,如何从存储过程中检索输出值?

时间:2011-10-28 11:17:19

标签: c# .net sql-server tsql stored-procedures

在SqlServer Management Studio中,当我执行存储过程并抛出异常时,它也会返回输出值。

我无法弄清楚如何从C#.NET获取这些值 - 当抛出异常时,停止执行并且不填充输出值。

3 个答案:

答案 0 :(得分:3)

我很确定你可以使用RAISERROR - 这会将指定的信息返回给应用程序。请注意,这可能不是理想的做法;如果你没有控制存储过程来实现它,也可能为时已晚。

答案 1 :(得分:1)

如果您同时控制了存储过程和执行存储过程的代码,那么我们广泛使用的另一种替代方法是使用OUTPUT存储过程参数将错误代码返回给调用者(即@ErrorCode INT = 0 OUTPUT)。

在我看来,这比提出错误有一些好处:

1)异常处理是.net框架中非常昂贵的操作。如果您只需要做的就是告诉用户他们输入的数据有问题,或者数据库中存在冲突,返回错误代码对应用程序和服务器的性能影响要小于抛出并捕捉异常。

2)如果你的程序在处理过程中已经足够了,你可以填充其他参数。例如,如果您需要包含有关哪个用户锁定了记录的信息,您可以将此信息包含在另一个输出参数中,并在代码中构建错误消息。

3)通过此方法支持消息国际化或自定义比通过存储过程中编码的错误消息更容易。

答案 2 :(得分:1)

如果要将查询封装在try catch块中,可以使用SQLServer方法检索异常数据:

BEGIN TRY
 --SQL Statements
END TRY

BEGIN CATCH
  --exception details

    SELECT ERROR_NUMBER()  
    SELECT ERROR_STATE()  
    SELECT ERROR_SEVERITY()  
    SELECT ERROR_LINE()  
    SELECT ERROR_PROCEDURE()  
    SELECT ERROR_MESSAGE()   

END CATCH

如果您没有运行try catch块。 SqlServer在其日志中存储错误,您可以使用以下命令使用t-sql读取它:

EXEC sys.xp_readerrorlog 1