tengo el siguiente trozo de código que se ejecuta una instrucción SQL:no puede detectar errores de SQL cuando se utiliza 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
}
}
sentencias SQL larga ejecución puede reportar el progreso a través de la SqlInfoMessageEventHandler levantando un error al usar RAISERROR con el valor de gravedad apropiado.
Las razones para establecer FireInfoMessageEventOnUserErrors en true se deben a que, sin esto, todos los mensajes de la instrucción SQL solo se procesan todos a la vez cuando se devuelve ExecuteNonQuery(). Con este valor establecido en verdadero, los mensajes de progreso se procesan a medida que la instrucción SQL los plantea.
Como sugiere el nombre de la propiedad, el controlador de eventos también desencadena errores y no solo en el nivel de gravedad específico reservado para la retroalimentación de progreso por la instrucción SQL.
El controlador de eventos para las votaciones progreso se ve así:
public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
if (e.Errors.Count > 0)
{
throw new Exception("Something bad happened");
}
// Report progress
}
Como se puede ver, se puede detectar cuando se produce un error de la propiedad dentro de 'e', pero lanzando la excepción no hace nada . Esperaba que la ejecución cayera en el bloque catch, pero este no es el caso.
¿Cómo puedo determinar después del método ExcecuteNonQuery() que se produjo un error?
TIA
Puede ejecutar su código en un hilo y llamar a un thread.abort en esa función – SamFisher83
+1: Me encantan las preguntas donde aprendo algo solo por leerlo. – NotMe