C# 若引发异常,如何从存储过程中检索输出值?

C# 若引发异常,如何从存储过程中检索输出值?,c#,.net,sql-server,tsql,stored-procedures,C#,.net,Sql Server,Tsql,Stored Procedures,在SQLServerManagementStudio中,当我执行存储过程并引发异常时,它还会返回输出值 我不知道如何从C#.NET中获取该值-当抛出异常时,停止执行,并且不填充输出值。我很确定您可以使用-将指定的信息返回给应用程序。提醒你,这可能不是一个理想的做法;如果您无法控制存储过程来实现这一点,也可能为时已晚。我确信您可以使用-将指定的信息返回给应用程序。提醒你,这可能不是一个理想的做法;如果您不能控制存储过程来实现这一点,那么对您来说也可能太晚了。如果您可以控制存储过程和执行存储过程的代

在SQLServerManagementStudio中,当我执行存储过程并引发异常时,它还会返回输出值


我不知道如何从C#.NET中获取该值-当抛出异常时,停止执行,并且不填充输出值。

我很确定您可以使用-将指定的信息返回给应用程序。提醒你,这可能不是一个理想的做法;如果您无法控制存储过程来实现这一点,也可能为时已晚。

我确信您可以使用-将指定的信息返回给应用程序。提醒你,这可能不是一个理想的做法;如果您不能控制存储过程来实现这一点,那么对您来说也可能太晚了。

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

在我看来,这比提出错误有几个好处:

1) 在.net framework中,异常处理是一项非常昂贵的操作。如果您只需要告诉用户他们输入的数据有问题或数据库中存在冲突,那么返回错误代码对应用程序和服务器性能的影响将比抛出和捕获异常小得多

2) 如果您的过程在处理过程中做得足够充分,则可以填充其他参数。例如,如果需要包含锁定记录的用户的信息,则可以在另一个输出参数中包含此信息,并在代码中生成错误消息


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

如果您同时控制存储过程和执行存储过程的代码,然后,我们广泛使用的另一种替代方法是使用输出存储过程参数向调用者返回错误代码(即@ErrorCode INT=0输出)

在我看来,这比提出错误有几个好处:

1) 在.net framework中,异常处理是一项非常昂贵的操作。如果您只需要告诉用户他们输入的数据有问题或数据库中存在冲突,那么返回错误代码对应用程序和服务器性能的影响将比抛出和捕获异常小得多

2) 如果您的过程在处理过程中做得足够充分,则可以填充其他参数。例如,如果需要包含锁定记录的用户的信息,则可以在另一个输出参数中包含此信息,并在代码中生成错误消息


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

如果将查询封装在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

如果将查询封装在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

嗯,输出参数不应该在出现错误时填充,但我刚刚测试了它们(对于这种情况,
CREATE PROC FOO@I INT output AS SET@I=10 SELECT 1/0
),为什么需要失败的存储过程的输出值?这听起来像是一个坏习惯。我建议捕获一个异常并在这种情况下使用默认值,如果您真的需要,您可以从C#代码中提供这些值,或者更好—保留异常气泡并在应用程序中相应地处理它。@Ivaylo Slavov,使用输出参数,如果异常在我上面的注释后面出现,我可以获得额外的信息,除非遇到异常,否则这些异常似乎已填充
SELECT CAST('FISH'作为INT)
使它们不被填充。嗯,输出参数不应该在出错时填充,但我刚刚测试过,它们似乎是(在本例中,
CREATE PROC FOO@I INT output AS SET@I=10 SELECT 1/0
)为什么需要失败的存储过程的输出值?这听起来像是一个坏习惯。我建议捕获一个异常并在这种情况下使用默认值,如果您真的需要,您可以从C#代码中提供这些值,或者更好—保留异常气泡并在应用程序中相应地处理它。@Ivaylo Slavov,使用输出参数,如果异常在我上面的注释后面出现,我可以获得额外的信息,除非遇到异常,否则这些异常似乎已填充<代码>选择CAST('FISH'作为INT)使它们不受欢迎。您可以在正在抛出的SqlException的Errors集合中获得其他信息。此外,您可以使用上面答案中建议的RAISERROR,并且Errors集合将包含RAISERROR引发的每个错误的信息。您可以在正在引发的SqlException的Errors集合中获得其他信息。此外,您可以按照上面答案中的建议使用RAISERROR,并且Errors集合将包含RAISERRORI抛出的每个错误的信息。我根据错误设置了
@bitErrorCondition1
@bitErrorCondition2
,这样我的调用代码就可以找出错误所在,而不是解析我的
RAISERROR
调用的文本。它在.net中运行良好,但当我尝试从T-SQL b中读取存储过程设置的输出变量时