使用Ado.Net存储过程时是否可靠地抛出异常?

时间:2010-07-27 09:20:34

标签: c# stored-procedures ado.net exception

如果我尝试调用存储过程并且存在数据库错误,那么这会在我的C#代码中引发异常吗?或者我是否需要检查存储过程的结果并自己引发异常?

例如:

using (SqlCommand cmd = new SqlCommand("prc_InsertSomething", conn))
{
    if (cmd.ExecuteNonQuery() != 1) // should I be doing this bit or not?
    {
        throw new DataException("Could not insert something");
    }
}

由于

3 个答案:

答案 0 :(得分:2)

我真的取决于错误的严重程度。请查看以下链接:

http://msdn.microsoft.com/en-us/library/ms177497.aspx

  

RAISERROR严重程度为11到19   在一个的TRY块中执行   TRY ... CATCH构造导致控制   转移到相关的CATCH   块。

     

指定严重性为10或更低的   使用RAISERROR返回消息   不调用CATCH块。打印   不会将控制权转移到CATCH   块。

因此,它将取决于存储过程引发的错误的严重性,无论它是否在调用代码的异常处理程序中捕获。

答案 1 :(得分:2)

对于ExecuteNonQuery,只要严重程度足够高,您通常就可以了。但是,如果您阅读数据,请务必小心;例如,如果你有一个存储过程返回多个网格并在倒数第二个结果集之前抛出一个异常(例如),那么如果你没有迭代你可能永远看不到的数据错误。

这是因为错误被注入TDS流(不是带外)。您需要使用TDS 至少为错误,以便您的代码了解它。

简单的事情(在IDataReader的情况下):

while (reader.NextResult()) { }
消耗代码后,

将确保您使用整个入站TDS流。

答案 2 :(得分:1)

这取决于错误,但通常情况下,如果存储过程失败,则会导致SqlException被抛出。

如果您没有在存储过程本身中捕获错误/异常,它将通过数据库提供程序冒出来。