Ошибка Catch SQL в С#

Я генерирую ошибку повышения в процедуре SQL:

RAISERROR('Already exist',-10,-10)

но я не могу поймать его, используя следующий код в С#

catch (SqlException ex)
{
    bResult = false;                   
    if (ex.Errors[0].Number == -10)
    {
        CommonTools.vAddToLog("bInsertNewUser", "ManageUsers", ex.Message);
        if ((savePoint != null))
            savePoint.Rollback();
    }
} 

Как я могу поймать поднятую ошибку в С#?

Ответы

Ответ 1

RAISERROR с значением СЕВЕРНОСТИ, равным или равным 10, не попадают на сторону С#, потому что я полагаю, что они считаются просто предупреждениями, как вы можете видеть из список Уровень серьезности ошибки в базе данных

Значения СЕВЕРНОСТИ между 11 и 16 являются ошибками, которые могут быть исправлены пользователем, поэтому, например, вы можете попробовать:

RAISERROR('Already exist',16,1)

В противном случае вы можете выбрать другой код ошибки из приведенного выше списка или, если вам это действительно нужно, подготовить свое собственное сообщение об ошибке с помощью sp_addmessage.

Ответ 2

В вашем заявлении if происходит сбой. Предполагая, что первая ошибка в коллекции действительно та, которую вы ищете (это может быть не так).

SqlError.Number - это не значение, которое вы установили в RAISERROR.

Используйте SqlError.Class, чтобы получить серьезность ошибки, или SqlError.State, чтобы проверить состояние (оба в вашем примере равны -10, поэтому трудно определить, что вы имеете в виду):

catch (SqlException ex)
{
    bResult = false;                   
    if (ex.Errors[0].Class == -10)
    {
        CommonTools.vAddToLog("bInsertNewUser", "ManageUsers", ex.Message);
        if ((savePoint != null))
            savePoint.Rollback();
    }
} 

Ответ 3

Используйте код ошибки в пределах 11-16 или просто используйте 16 для "общего" случая.

RAISERROR('Already exists',16,1)

Зачем? Вот мое резюме https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-error-severities?view=sql-server-2017:

SQL RAISERROR → С#:

  • 0-10 = фю *
  • 11-16 = вы можете это исправить **
  • 17-19 = получить помощь администратора
  • 20-24 = обязательно получите помощь администратора ***

* (ничего не бросай) ┬──┬

** (16 = общее)

***(фатальная ошибка)