У меня есть следующий фрагмент кода, который запускает оператор SQL:
int rowsEffected = 0;
using (SqlConnection dbConnection = new SqlConnection(dbConnectionString))
{
try
{
dbConnection.InfoMessage += new SqlInfoMessageEventHandler(dbConnection_InfoMessage);
dbConnection.FireInfoMessageEventOnUserErrors = true;
dbConnection.Open();
SqlCommand command = dbConnection.CreateCommand();
command.CommandTimeout = 0;
command.CommandText = sqlStatement;
rowsEffected = command.ExecuteNonQuery();
}
catch (Exception e)
{
// Handle exception
}
}
Длительные операторы SQL могут сообщать о ходе выполнения через SqlInfoMessageEventHandler, вызывая ошибку с помощью RAISERROR с соответствующим значением серьезности.
Причина установки для FireInfoMessageEventOnUserErrors значения true заключается в том, что без этого все сообщения из инструкции SQL обрабатываются только сразу, когда ExecuteNonQuery() возвращает значение. Если для этого значения задано значение true, сообщения о ходе выполнения обрабатываются по мере их создания оператором SQL.
Как следует из названия свойства, обработчик событий также срабатывает при ошибках, а не только при определенном уровне серьезности, зарезервированном для обратной связи с оператором SQL.
Обработчик событий для обратной связи о ходе выполнения выглядит следующим образом:
public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
if (e.Errors.Count > 0)
{
throw new Exception("Something bad happened");
}
// Report progress
}
Как видите, я могу определить, когда возникает ошибка, по свойству внутри 'e', но создание исключения ничего не делает. Я надеялся, что выполнение попадет в блок catch, но это не так.
Как после метода ExcecuteNonQuery() определить, что произошла ошибка?
ТИА