2010-06-03 3 views

답변

11

SqlException에는 예외가 발생한 SqlCommand에 대한 참조가 없습니다. 로거에는이 작업을 수행 할 수있는 방법이 없습니다. 당신이 할 수있는 일은 SqlCommand을 실행하는 메소드에서 SqlException을 잡아서 더 자세한 설명적인 예외로 감싸는 것입니다. 예 :

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

이렇게하면 더 표현적인 예외를 기록 할 수 있습니다.

2

SQL 예외를 throw 할 수 없습니다. 나는 그가 명령을 포함하고있는 새로운 Exception을 던질 의도가 있다고 생각한다. CommandText.

0

이렇게하는 가장 빠른 방법은 매개 변수가있는 쿼리를 사용하는 경우 대리자 인 sql 명령 텍스트와 선택적으로 sql 매개 변수 배열을 사용하는 도우미 메서드를 작성하는 것입니다. 시도의 catch 블록에있는 대리자를 감싸고 예외가있을 때 LogError 메서드를 호출 : 나는 데이터 계층 헬퍼 메소드에서 ExecuteAndLogError를 호출 내 SQL 코드에서

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

. 모든 데이터 계층 메서드는 ExecuteAndLogError를 호출하므로 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; 

}

당신은 다음과 같이 사용할 수 있습니다 : repo.ExecuteDataTable("SELECT * FROM Users");를 추가 로깅을 수행 할 수있는 LogError 방법을 구현할 수있는 예외가 있다면.

이 코드 중 일부는 하위 텍스트 블로그 데이터 레이어 클래스에서 가져온 것입니다.