2010-07-27 63 views
4

如果我尝试调用一个存储过程并且存在数据库错误,那么会在我的C#代码中引发异常吗?或者我需要检查存储过程的结果并自己提出异常?使用Ado.Net存储过程时可靠地抛出异常吗?

如:

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"); 
    } 
} 

感谢

回答

2

对于ExecuteNonQuery,您将一般只要严重程度足够高即可;但是,如果您是读取数据,请小心;例如,如果存储过程返回多个网格并在倒数第二个结果集之前引发异常(例如),则如果您不遍历数据,则可能永远不会看到该错误。

这是因为错误被注入TDS流(不是带外)。您需要使用TDS ,至少在错误处,您的代码才能意识到这一点。

的东西(在IDataReader的情况下)一样简单:

while (reader.NextResult()) { } 

您的消费代码后,将确保你消耗整个入境TDS流。

1

这取决于错误,但通常情况下,如果一个存储过程失败就会造成SqlException被抛出。

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

1

我真的依赖于错误的严重程度。检查出下面的链接:

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

的11〜19 在 TRY ... CATCH的TRY块执行的RAISERROR严重性构造使控制 转移到相关联的CATCH 块。

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

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

+0

我相信OP是询问拦截调用应用程序中的异常,而不是存储过程本身。 – Oded 2010-07-27 09:27:24