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.