RAISERROR-如何区分SqlException?

时间:2011-06-28 15:44:54

标签: c# wcf sql-server-2005 sqlexception raiserror

我有3-4个存储过程 - 如果需要我可以修改 - 使用RAISERROR通知我的应用程序在数据库端出现一些致命错误。其中一些存储过程使用ExecuteNonQuery从C#端执行,而其他存储过程则使用ExecuteReader执行。目前,我将这些命令包装在try { ... } catch (SqlException ThisSqlException) { ... }块中,但问题是这个异常将在至少两个我必须单独处理的场景中抛出:

1)连接本身出错,或出现故障或类型不匹配的参数;和

2)我明确使用RAISERROR时出现的错误。

由于这是一个WCF应用程序,我必须根据异常的性质(无论是否由于RAISERROR命令)返回客户端应用程序的不同反馈。那么,我怎样才能区分这两种情况呢?

2 个答案:

答案 0 :(得分:14)

RAISERROR command包含一个msg_id参数,可用于识别错误类型。该值通过SqlException.Number属性提供给应用程序。通过这种方式,您可以识别由存储过程引发的任何异常,该异常包括系统中定义的自定义错误消息。

如果使用文本字符串错误消息调用RAISERROR,则Number将为50000。

答案 1 :(得分:4)

当您捕获SqlException时,您可以检查其包含详细错误消息的Errors个集合。

这些SqlError对象包含非常详细的信息 - 包括错误代码,消息等等。

使用该信息,您应该能够轻松区分基于连接的错误或您自己提出的错误。