【问题标题】:RAISERROR―How to distinguish with SqlException?RAISERROR―如何与SqlException区别?
【发布时间】:2011-06-28 15:44:53
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多