我需要捕获以下特定异常:
System.Data.OleDb.OleDbException被捕获ErrorCode=-217467259
消息="您请求对表的更改未成功因为它们会在索引、主键、和,或关系。更改包含的字段中的数据重复数据、删除索引或重新定义索引以允许重复条目,然后重试。"Source="Microsoft JET数据库引擎"StackTrace:在System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult小时)位于System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMSdbParams,对象&executeResult)位于System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object&executeResult)在System.Data.OleDb.OleDbCommand.ExecutedCommand(CommandBehavior行为,对象&executeResult)位于System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior行为,字符串方法)在System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
我不确定ErrorCode
是什么,但它看起来不可靠。
我可以相信Message
在不同平台上是相同的吗?
我可以以某种方式使用在堆栈跟踪中找到的OleDbHResult hr
值吗?(请参见https://stackoverflow.com/a/991660/327528)
唯一的解决方案是在Message
中搜索像duplicate
和primary key
这样的单词吗?
您说得对,错误代码(-2147467259=0x80004005=E_FAIL)过于通用,依赖消息非常脆弱-例如,考虑本地化。
我会查看OleDbException.Errors
集合,试图找到更具体的内容。
OleDbException
的JET错误代码可以从以下位置找到:
OleDbError.SQLState
对于问题中提供的异常,其为CCD_ 9。
您可以尝试对OleDbException.Errors
集合中的每个错误使用SQLState
属性
找到此引用:SQL状态错误代码<-不再工作
更新参考:SQL错误代码
try {
cmd.ExecuteNonQuery();
} catch (OleDbException ex) {
if (ex.ErrorCode == -2147467259) {
MessageBox.Show("Hi , yes");
}
}