사내 애플리케이션의 예외 정보를 기록하는 로거가 있습니다.SQLException의 원인이되는 Query/CommandText를 얻는다
SQL 예외를 기록 할 때 예외를 유발 한 실제 쿼리를 볼 수 있다면 매우 유용 할 것입니다.
우리가 이것을 달성 할 수있는 방법이 있습니까?
사내 애플리케이션의 예외 정보를 기록하는 로거가 있습니다.SQLException의 원인이되는 Query/CommandText를 얻는다
SQL 예외를 기록 할 때 예외를 유발 한 실제 쿼리를 볼 수 있다면 매우 유용 할 것입니다.
우리가 이것을 달성 할 수있는 방법이 있습니까?
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);
}
}
이렇게하면 더 표현적인 예외를 기록 할 수 있습니다.
SQL 예외를 throw 할 수 없습니다. 나는 그가 명령을 포함하고있는 새로운 Exception을 던질 의도가 있다고 생각한다. CommandText.
이렇게하는 가장 빠른 방법은 매개 변수가있는 쿼리를 사용하는 경우 대리자 인 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 방법을 구현할 수있는 예외가 있다면.
이 코드 중 일부는 하위 텍스트 블로그 데이터 레이어 클래스에서 가져온 것입니다.