Ошибка 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 = общее)
***(фатальная ошибка)