У меня есть следующий фрагмент кода, который запускает 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(), что произошла ошибка?
ТИА
Вы можете запустить свой код в потоке и вызвать thread.abort в этой функции – SamFisher83
+1: Мне нравятся вопросы, где я чему-то научился, просто прочитав его. – NotMe