RAISERROR - 如何与SqlException区分开?

10

我有一些3-4个存储过程――如果需要,我可以进行修改――这些存储过程使用RAISERROR来通知我的应用程序数据库端发生了一些致命错误。其中一些存储过程通过ExecuteNonQuery从C#一侧执行,而另一些则通过ExecuteReader执行。目前,我正在将这些命令封装在一个try { ... } catch (SqlException ThisSqlException) { ... }块中,但是问题在于,此异常至少会在两种必须单独处理的情况下被引发:

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

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

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

2个回答

17
RAISERROR 命令 包含 msg_id 参数,可用于标识错误类型。该值通过 SqlException.Number 属性提供给应用程序。这样,您就可以确定包含系统定义的自定义错误消息的存储过程引发的任何异常。 如果使用文本字符串错误消息调用 RAISERROR,则Number将为50000。

1
您可以为msg_id指定自定义数字以识别您自己的特定错误,但该数字需要首先在数据库sys.messages表中注册,并且需要大于50000。请参阅http://msdn.microsoft.com/en-us/library/ms178592.aspx。 - stombeur

5
当你捕获到SqlException异常时,可以检查其中的Errors集合,其中包含了详细的错误信息。
这些SqlError对象包含非常详细的信息,包括错误代码、消息等等。
通过这些信息,你应该能够轻松区分基于连接的错误或自己引发的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接