尝试NHibernate事务时捕获SqlException

时间:2011-03-22 14:46:27

标签: c# asp.net asp.net-mvc nhibernate exception

我需要查看由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);
    }
}

请原谅我的无知。

2 个答案:

答案 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将其转换为更有意义的异常。