Поймать ошибку SQL raise в C#

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

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

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

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

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

2 ответов


RAISERRORs со значением серьезности ниже или равным 10 не пойманы на стороне C#, потому что я полагаю, что они считаются просто предупреждениями, как вы можете видеть из список на Серьезность Ошибки Ядра СУБД

значения серьезности между 11 и 16 являются ошибками, которые могут быть исправлены пользователем, поэтому, например, вы можете попробовать:

RAISERROR('Already exist',16,1)

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


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

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();
    }
}