2010-06-03 13 views

Respuesta

11

El SqlException no contiene una referencia al SqlCommand que causó la excepción. En tu registrador no hay forma de hacer esto. Lo que podría hacer es capturar la SqlException en el método que ejecuta el SqlCommand y envolverlo en una excepción más descriptiva. Ejemplo:

using (var command = new SqlCommand(connection, "dbo.MyProc")) 
{ 
    try 
    { 
     command.Execute(); 
    } 
    catch (DbException ex) 
    { 
     throw new InvalidOperationException(ex.Message + " - " + command.Text, ex); 
    } 
} 

De esta forma puede registrar esta excepción más expresiva.

2

NO puede lanzar una excepción sql. Creo que se proponía lanzar una nueva Excepción que contiene el comando. CommandText.

0

La manera más fácil de hacerlo es escribir un método auxiliar que tome un delegado, el texto del comando sql y, opcionalmente, una matriz de parámetros sql si está utilizando consultas parametrizadas. Envolver el delegado en un bloque intento de captura y llame al método LogError cuando hay una excepción:

protected virtual TResult ExecuteAndLogError<TResult>(Func<TResult> code, string sql, SqlParameterCollection parameters = null) 
{ 
    try { 
     if ((System.Diagnostics.Debugger.IsAttached)) 
      PrintSqlToDebug(sql, parameters); 
     return code(); 
    } catch (Exception ex) { 
     LogError(sql, parameters, ex); 
     throw; 
    } 
} 

En mi código SQL que llamo ExecuteAndLogError de métodos de ayuda capa de datos. Todos los métodos de la capa de datos llaman ExecuteAndLogError, por lo que solo hay una sección de código para registrar errores de SQL.

public virtual DataTable ExecuteDataTable(SqlCommand command, params SqlParameter[] parameters) 
{ 
    command.Parameters.AddRange(parameters); 
    DataTable table = new DataTable(); 

    using (SqlDataAdapter adapter = new SqlDataAdapter(command)) { 
     using (command) { 
      ExecuteAndLogError(() => adapter.Fill(table), command.CommandText, command.Parameters); 
     } 
    } 

    return table; 

}

Se puede utilizar la siguiente manera: repo.ExecuteDataTable("SELECT * FROM Users"); Si hay una excepción se puede aplicar el método LogError para llevar a cabo el registro adicional.

Parte de este código fue tomado de las clases de la capa de datos de Subtext Blog.

Cuestiones relacionadas