10

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

1) 连接本身错误,或者参数错误或类型不匹配;和

RAISERROR2)每当我明确使用时发生的错误。

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

4

2 回答 2

17

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

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

于 2011-06-28T15:52:52.610 回答
5

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

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

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

于 2011-06-28T15:51:18.957 回答