Не удается обнаружить ошибку SQL при использовании ExecuteNonQuery () - PullRequest
6 голосов
/ 15 марта 2012

У меня есть следующий бит кода, который выполняет оператор 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
}

Как вы можете видеть, я могу определить, когда по свойству возникает ошибкав «е», но исключение ничего не делает.Я надеялся, что выполнение упадет в блок catch, но это не так.

Как я могу определить после метода ExcecuteNonQuery (), что произошла ошибка?

TIA

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Мне удалось обойти это.Я добавил свойство в класс, который содержит обработчик событий.Если произошла ошибка, я отправил в этот класс свойство флага ошибки, которое затем можно прочитать после вызова ExcecuteNonQuery ().Если произошла ошибка, я могу выполнить мой код очистки.Спасибо за ответ.

1 голос
/ 16 марта 2012

Используйте SqlException класс вместо Exception класса.А затем посмотрите на e.Errors

...