2010-06-03 6 views

Antwort

11

Die SqlException enthält keinen Verweis auf die SqlCommand, die die Ausnahme verursacht. In Ihrem Logger gibt es keine Möglichkeit, dies zu tun. Sie können die SqlException in der Methode abfangen, die SqlCommand ausführt, und sie in eine beschreibende Ausnahme umbrechen. Beispiel:

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

Auf diese Weise können Sie diese aussagekräftigere Ausnahme protokollieren.

2

Sie können keine SQL-Ausnahme auslösen. Ich denke, er wollte eine neue Exception werfen, die den Befehl enthält.CommandText.

0

Die DRYest-Methode besteht darin, eine Hilfsmethode zu schreiben, die einen Delegaten, den SQL-Befehlstext und optional ein SQL-Parameterarray verwendet, wenn Sie parametrisierte Abfragen verwenden. Wickeln Sie die Delegierten in einem Try-Catch-Block und rufen Sie die LogError Methode, wenn es eine Ausnahme:

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; 
    } 
} 

In meinem SQL-Code I ExecuteAndLogError von Datenschicht Helfer Methoden aufrufen. Alle Datenschichtmethoden rufen ExecuteAndLogError auf, daher gibt es nur einen Codeabschnitt, um SQL-Fehler zu protokollieren.

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; 

}

Sie können es wie folgt verwenden: repo.ExecuteDataTable("SELECT * FROM Users"); Wenn es eine Ausnahme ist, dass Sie die LogError Methode implementieren können zusätzliche Protokollierung durchzuführen.

Ein Teil dieses Codes wurde aus den Datenschichtklassen des Subtex-Blogs übernommen.