2

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

System.Data.OleDb.OleDbException 被捕获 ErrorCode=-2147467259
Message="您请求对表的更改不成功,因为它们会在索引、主键或关系中创建重复值。更改包含重复数据的字段中的数据、删除索引或重新定义索引允许重复条目并重试。” Source="Microsoft JET 数据库引擎" StackTrace:在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 在 System.Data.OleDb.OleDbCommand 的 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)。 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,Object&executeResult) 的 System.Data.OleDb 的 ExecuteCommandText(Object& executeResult)。

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

我可以依靠Message跨平台相同吗?

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

是对诸如和之Message类的词进行文本搜索的唯一解决方案吗?duplicateprimary key

4

4 回答 4

7

没错,ErrorCode (-2147467259 = 0x80004005 = E_FAIL) 太通用了,并且依赖消息非常脆弱 - 例如考虑本地化。

我会查看该OleDbException.Errors系列以尝试找到更具体的内容。

于 2012-10-09T09:41:39.847 回答
2

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

OleDbError.SQLState

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

于 2012-10-10T12:25:36.997 回答
2

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

找到此参考: SQL 状态错误代码<- 不再工作
更新参考:SQL 错误代码

于 2013-02-11T17:18:15.027 回答
-1
try {
  cmd.ExecuteNonQuery();
} catch (OleDbException ex) {
  if (ex.ErrorCode == -2147467259) {
    MessageBox.Show("Hi , yes");
  }
}
于 2013-01-28T13:21:17.107 回答