2016-07-21 4 views
0

로그 처리 예외 및 디버깅을 위해 내 ado.net 기반 응용 프로그램에서 서버로 보낸 SQL 문을 알고 싶습니다. MS SQL 연결 제공자를 처리하는 일반 DAL을 사용합니다.어떤 SQL 문이 ado.net 응용 프로그램 (MS SQL 공급자)에서 서버로 보냈습니다

SELECT deqs.last_execution_time AS [Time], dest.TEXT AS [Query] 
FROM sys.dm_exec_query_stats AS deqs 
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest 
ORDER BY deqs.last_execution_time DESC 

참조 : SQL Server Query Trace

및 많은 다른 사람을 그들이 SSMS 내에서 실행되는 경우 SQL 코드는 쿼리를 잡을 수 SO

에서 (SQL을 SO 검색하는 동안

나는이 쿼리를 발견 서버 관리 Studio)

하지만 MS SQL 데이터베이스에 연결된 Ado.net 응용 프로그램에서 쿼리를 전송할 수 있습니까? atabase 서버.

내 질문 : 그들은이 코드를 사용 Ado.net 기반 응용 프로그램에서 전송하는 경우 I 쿼리를 잡을 수없는 이유

?

내 응용 프로그램에서 전송 된 실제 SQL 문을 잡을 수있는 다른 방법 (SQL 코드/C# 코드는) 거기에 (같은 내가 SQL의 profiller에서 무엇을 얻을) 당신의 DAL은 추상적 인 IDbConnection을과에 IDbCommand 인터페이스를 사용하는 경우

+1

쿼리에 관계없이 실행 방법의 캐시 된 쿼리를 찾을 수 있습니다. 따라서 DMV 쿼리를 실행하기 전에 쿼리가 캐시되지 않거나 축출되었습니다. 이러한 목적으로 DMV를 사용하는 대신 확장 이벤트 또는 SQL 추적 (프로파일 러)을 사용하여 추적을 고려하십시오. –

+0

SQL 프로파일 러는 온라인 상호 작용이 필요합니다. 로깅을위한 코드가 필요합니다. –

+0

프로파일 러 파일 -> 내보내기 -> 스크립트 추적 정의 메뉴에서 무인 서버 측 추적을 위해 프로파일 러에서 추적을 스크립팅 할 수 있습니다. 스크립트를 수정하여 원하는 파일 이름 패턴, 파일 크기, 롤오버 등을 지정하십시오. –

답변

1

을,

public class MyDbConnection : IDbConnection { 
     private IDbConnection src; 
     public MyDbConnection(IDbConnection src) { 
      this.src = src; 
     } 
     public IDbCommand CreateCommand() { 
      return new MyDbCommand(src.CreateCommand()); 
     } 
     //TODO create pass-through implementations of the rest of IDbConnection methods... 
    } 

    public class MyDbCommand : IDbCommand { 
     private IDbCommand src; 
     public MyDbCommand(IDbCommand src) { 
      this.src = src; 
     } 

     public int ExecuteNonQuery() { 
      log.Info(src.CommandText); 
      return src.ExecuteNonQuery(); 
     } 

     public IDataReader ExecuteReader() { 
      log.Info(src.CommandText); 
      return src.ExecuteReader(); 
     } 

     public IDataReader ExecuteReader(CommandBehavior behavior) { 
      log.Info(src.CommandText); 
      return src.ExecuteReader(behavior); 
     } 

     public object ExecuteScalar() { 
      log.Info(src.CommandText); 
      return src.ExecuteScalar(); 
     } 

     //TODO create pass-through implementations of the rest of IDbCommand methods and properties... 
    } 
: 당신이 당신의 IDbConnection을 인스턴스화하기위한 공통의 공장을 가지고, 당신은 진짜 기본 객체를 호출하기 전에가 ExecuteReader, ExecuteNonQuery는 및 ExecuteScalar는 로그에 IDbCommand 당신 자신의 구현을 반환 CreateCommand를 무시 IDbConnection을 당신 자신의 구현을 만들 수 있습니다

자, 어디에 있든간에 귀하의 IDbConnection, 대신 새로운 MyDbConnection (theRealDbConnection) 반환 ...

+0

src.CommandText는 매개 변수가있을 때 서버로 보내지는 완전한 SQL이 아닙니다. MyDbCommand는 sql을 {sp_executesql 문, Parameter_types, Parameter_values}로 보내고 매개 변수없이 정보의 3 분의 1 만 기록합니다. sp_executesql 전체를 catch하고 싶습니다. 나는 그것을 작성하고 현재 DAL에 로그인 할 수 있지만 ado.net이 보낸 SQL 프로파일 러 도구로 캡처 한 실제 SQL 쿼리를 알고 싶습니다. 이 구현은 서버에 전송 된 완전한 SQl 쿼리를 생성하지 않습니다. –

0

아, 죄송합니다, 나는 질문을 오해. 내 이전 대답은 SQL 클라이언트가 서버에 보내는 내용이 아닌 응용 프로그램이 SQL 클라이언트에 보내는 내용을 캡처하는 방법을 보여줍니다.

SQL 클라이언트에서 서버로 보낸 SQL 문을 캡처하려면 sp_trace_create 및 관련 추적 기능을 사용하여 추적 정보를 응용 프로그램에 다시 보내도록 SQL Server를 구성해야합니다.

이 TechNet 문서가 당신에게 도움이 될 수있다 : SQL Trace