2012-03-15 23 views
5

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

+0

Puede ejecutar su código en un hilo y llamar a un thread.abort en esa función – SamFisher83

+1

+1: Me encantan las preguntas donde aprendo algo solo por leerlo. – NotMe

Respuesta

3

Pude resolver un problema. Agregué una propiedad a la clase que contiene el controlador de eventos. Si hubo un error, envié la propiedad de indicador de error en esa clase que luego puede leerse después de la llamada a ExcecuteNonQuery(). Si hubo un error, entonces puedo hacer mi código de limpieza. Gracias por la respuesta.

+0

Marque esta respuesta como respondida – Marcin

+0

. Tuve que hacer algo similar, pero para una situación en la que un hilo externo tenía que acceder al objeto DB Command, almacené el último usado para bloquear o bloquear las llamadas SQL. otro hilo. – Brain2000

1

Uso SqlException clase en lugar de Exception clase. Y luego mira en e.Errors

+0

Gracias por la respuesta. En realidad, no estoy usando Exception, estoy usando una excepción personalizada, pero solo por el ejemplo de código lo cambié a Exception. No tiene acceso a e.Errors en el código que llama a ExcecuteNonQuery(). – millie

Cuestiones relacionadas