2012-03-15 4 views
5

У меня есть следующий фрагмент кода, который запускает SQL заявления:не удается обнаружить ошибки SQL при использовании ExecuteNonQuery()

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 может сообщать прогресс, поднимая ошибку, используя RAISERROR с помощью SqlInfoMessageEventHandler соответствующее значение серьезности.

Причины для установки 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(), что произошла ошибка?

ТИА

+0

Вы можете запустить свой код в потоке и вызвать thread.abort в этой функции – SamFisher83

+1

+1: Мне нравятся вопросы, где я чему-то научился, просто прочитав его. – NotMe

ответ

3

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

+0

Пожалуйста, отметьте этот ответ как ответ – Marcin

+0

Мне нужно было сделать что-то подобное, но для ситуации, когда внешнему потоку приходилось обращаться к объекту DB Command, поэтому я сохранил последний использованный, поэтому блокирование SQL-вызовов можно было бы проверить или отменить другой поток. – Brain2000

1

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

+0

Спасибо за ответ. Я фактически не использую Exception, я использую настраиваемое исключение, но только для примера кода я изменил это на Exception. У вас нет доступа к e.Errors в коде, который вызывает ExcecuteNonQuery(). – millie