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