如何捕获特定的OleDbException?

时间:2012-10-09 09:31:08

标签: .net exception-handling oledbconnection hresult

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

  

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

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

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

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

Messageduplicate这样的字词进行primary key的文字搜索是唯一的解决方案吗?

4 个答案:

答案 0 :(得分:7)

你是对的,ErrorCode(-2147467259 = 0x80004005 = E_FAIL)过于通用,依赖于该消息非常脆弱 - 例如考虑本地化。

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

答案 1 :(得分:2)

OleDbException的JET错误代码可以从以下网址找到:

OleDbError.SQLState

对于问题中提供的例外,3022

答案 2 :(得分:2)

您可以尝试对SQLState集合

中的每个错误使用OleDbException.Errors属性

发现此参考: SQL State Error Codes

答案 3 :(得分:-1)

try {
  cmd.ExecuteNonQuery();
} catch (OleDbException ex) {
  if (ex.ErrorCode == -2147467259) {
    MessageBox.Show("Hi , yes");
  }
}