我有3-4个存储过程 - 如果需要我可以修改 - 使用RAISERROR
通知我的应用程序在数据库端出现一些致命错误。其中一些存储过程使用ExecuteNonQuery
从C#端执行,而其他存储过程则使用ExecuteReader
执行。目前,我将这些命令包装在try { ... } catch (SqlException ThisSqlException) { ... }
块中,但问题是这个异常将在至少两个我必须单独处理的场景中抛出:
1)连接本身出错,或出现故障或类型不匹配的参数;和
2)我明确使用RAISERROR
时出现的错误。
由于这是一个WCF应用程序,我必须根据异常的性质(无论是否由于RAISERROR
命令)返回客户端应用程序的不同反馈。那么,我怎样才能区分这两种情况呢?
答案 0 :(得分:14)
RAISERROR
command包含一个msg_id参数,可用于识别错误类型。该值通过SqlException.Number
属性提供给应用程序。通过这种方式,您可以识别由存储过程引发的任何异常,该异常包括系统中定义的自定义错误消息。
如果使用文本字符串错误消息调用RAISERROR
,则Number
将为50000。
答案 1 :(得分:4)
当您捕获SqlException
时,您可以检查其包含详细错误消息的Errors
个集合。
这些SqlError
对象包含非常详细的信息 - 包括错误代码,消息等等。
使用该信息,您应该能够轻松区分基于连接的错误或您自己提出的错误。