【问题标题】:How to catch specific OleDbException?如何捕获特定的 OleDbException?
【发布时间】:2012-10-09 09:31:07
【问题描述】:

我需要捕获以下特定异常:

System.Data.OleDb.OleDbException 被捕获 ErrorCode=-2147467259
Message="您请求的对表格的更改不成功 因为他们会在索引、主键、 或关系。更改字段中的数据或包含 重复数据、删除索引或重新定义索引以允许 重复条目,然后重试。" Source="Microsoft JET 数据库 引擎”堆栈跟踪: 在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult 小时) 在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams、对象和执行结果) 在 System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象和执行结果) 在 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,对象和执行结果) 在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法) 在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()

我不确定ErrorCode 是什么,但它看起来不可靠。

我可以依赖 Message 在各个平台上相同吗?

我能以某种方式使用堆栈跟踪中的OleDbHResult hr 值吗? (见https://stackoverflow.com/a/991660/327528

Message 中搜索duplicateprimary key 之类的词是唯一的解决方案吗?

【问题讨论】:

    标签: .net exception-handling oledbconnection hresult


    【解决方案1】:

    您说得对,错误代码 (-2147467259 = 0x80004005 = E_FAIL) 太通用了,并且依赖消息非常脆弱 - 例如考虑本地化。

    我会查看OleDbException.Errors 集合以尝试找到更具体的内容。

    【讨论】:

    • OleDbHResult hr 呢?
    • @CJ7 - 如果你用反射器查看System.Data.dll,你会看到内部枚举OleDbhResult的定义。据我所知,它与ErrorCode = E_FAIL 相同,即非特定。
    【解决方案2】:

    OleDbException 的 JET 错误代码可从以下位置找到:

    OleDbError.SQLState
    

    问题中提供的例外情况是3022

    【讨论】:

      【解决方案3】:

      您可以尝试对OleDbException.Errors 集合中的每个错误使用SQLState 属性

      找到这个参考: SQL State Error Codes 更新参考:SQL error codes

      【解决方案4】:
      try {
        cmd.ExecuteNonQuery();
      } catch (OleDbException ex) {
        if (ex.ErrorCode == -2147467259) {
          MessageBox.Show("Hi , yes");
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-14
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 2017-07-25
        • 2014-12-04
        • 2014-10-10
        • 2016-10-17
        • 2011-12-16
        相关资源
        最近更新 更多