我需要查看由SqlException
生成的错误代码 - 但是,我无法启动它。我使用NHibernate并在我的表上设置SQL UNIQUE CONSTRAINT
。当违反该约束时,我需要捕获错误代码并根据该消息生成用户友好的消息。以下是我的try / catch示例:
using (var txn = NHibernateSession.Current.BeginTransaction()) {
try {
Session["Report"] = report;
_reportRepository.SaveOrUpdate(report);
txn.Commit();
Fetch(null, report.ReportId, string.Empty);
} catch (SqlException sqlE) {
var test = sqlE.ErrorCode;
ModelState.AddModelError("name", Constants.ErrorMessages.InvalidReportName);
return Fetch(report, report.ReportId, true.ToString());
} catch (InvalidStateException ex) {
txn.Rollback();
ModelState.AddModelErrorsFrom(ex, "report.");
} catch (Exception e) {
txn.Rollback();
ModelState.AddModelError(String.Empty, Constants.ErrorMessages.GeneralSaving);
}
}
请原谅我的无知。
答案 0 :(得分:7)
Check this out说明了如何捕获GenericADOException
并查看InnerException
属性:
catch (GenericADOException ex)
{
txn.Rollback();
var sql = ex.InnerException as SqlException;
if (sql != null && sql.Number == 2601)
{
// Here's where to handle the unique constraint violation
}
...
}
答案 1 :(得分:2)
我没有直接在控制器中捕获SqlException,而是设置SQLExceptionConverter将其转换为更有意义的异常。