Не удается обнаружить ошибку SQL при использовании ExecuteNonQuery()

У меня есть следующий фрагмент кода, который запускает оператор 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() определить, что произошла ошибка?

ТИА

6
задан millie 15 March 2012 в 16:18
поделиться