Надежно ли генерируются исключения при использовании хранимых процедур Ado.Net? - PullRequest
4 голосов
/ 27 июля 2010

Если я попытаюсь вызвать хранимую процедуру и возникнет ошибка базы данных, будет ли это вызывать исключение в моем коде C #?Или мне нужно проверить результат хранимой процедуры и самостоятельно вызвать исключение?

Например:

using (SqlCommand cmd = new SqlCommand("prc_InsertSomething", conn))
{
    if (cmd.ExecuteNonQuery() != 1) // should I be doing this bit or not?
    {
        throw new DataException("Could not insert something");
    }
}

Спасибо

Ответы [ 3 ]

2 голосов
/ 27 июля 2010

Я действительно зависит от серьезности ошибки. Проверьте следующую ссылку:

http://msdn.microsoft.com/en-us/library/ms177497.aspx

Уровень RAISERROR от 11 до 19 выполнено в блоке TRY Конструкция TRY… CATCH вызывает управление перевод в соответствующий CATCH блок.

Укажите степень серьезности от 10 до возвращать сообщения, используя RAISERROR без вызова блока CATCH. РАСПЕЧАТАТЬ не передает управление CATCH блок.

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

2 голосов
/ 27 июля 2010

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

Это связано с тем, что ошибка вводится в поток TDS (а не во внеполосный диапазон).Вам нужно использовать TDS как минимум до ошибки , чтобы ваш код узнал об этом.

Что-то столь же простое, как (в случае IDataReader):

while (reader.NextResult()) { }

после того, как ваш код потребления гарантирует, что вы используете весь входящий поток TDS.

1 голос
/ 27 июля 2010

Это зависит от ошибки, но обычно, если хранимая процедура завершается с ошибкой, она вызывает SqlException.

Если вы не улавливаете ошибку / исключение в самой хранимой процедуре, она будет отправлена ​​через поставщика базы данных.

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