Поймать SqlException при попытке транзакции NHibernate - PullRequest
1 голос
/ 22 марта 2011

Мне нужно увидеть код ошибки, сгенерированный SqlException - однако я не могу заставить его сработать. Я использую NHibernate и у меня на столе установлена ​​настройка SQL UNIQUE CONSTRAINT. Когда это ограничение нарушается, мне нужно перехватить код ошибки и создать удобное для пользователя сообщение на основе этого. Вот пример моей попытки / улова:

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 ]

7 голосов
/ 22 марта 2011

Проверьте это , которое иллюстрирует, как поймать 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
    }
    ...
}
2 голосов
/ 22 марта 2011

Вместо того, чтобы перехватывать SqlException непосредственно в вашем контроллере, я бы настроил SQLExceptionConverter , чтобы перевести его в более значимое исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...