2016-07-21 6 views
0

Я хочу знать, какой оператор sql отправлен на сервер из моего приложения на основе ado.net для регистрации исключений и отладки. Я использую общий DAL, который обрабатывает поставщика соединений MS SQL.какой оператор sql отправлен на сервер из приложения ado.net (поставщик MS SQL)

Я нашел этот запрос при поиске SO:

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

и многие другие в SO

Этот код SQL может поймать запросы, если они выполняются внутри SSMS (SQL сервер Management Studio)

, но НЕ МОЖЕТ улавливать запросы, если они отправлены из моего приложения Ado.net, связанного с MS sql d atabase.

Мой вопрос:

Почему я не могу поймать запросы, если они отправлены из приложения на основе ADO.NET с помощью этого кода?

Есть другой способ (SQL-код/​​C# код), чтобы поймать заявления реального SQL, посланные из моего приложения (например, то, что я получаю в SQL profiller)

+1

Запрос будет найти запрос, который кэшируется, независимо от того, как выполняется. Таким образом, возможно, запрос не кэшируется или был выдворен до запуска DMV-запроса. Вместо использования DMV для этой цели рассмотрите трассировку с использованием Extended Events или SQL Trace (Profiler). –

+0

SQL-профилировщик нуждается в интерактивном взаимодействии, мне нужен код для ведения журнала –

+0

Вы можете создать сценарий трассировки из профилировщика для автоматической трассировки на стороне сервера из меню «Файл профилирования» -> «Экспорт» -> «Определение трассировки сценария». Измените сценарий, чтобы указать желаемый шаблон имени файла, размер файла, опрокидывание и т. Д. –

ответ

1

Если DAL использует абстрактный интерфейс IDbConnection и интерфейсы IDbCommand, и у вас есть общий завод для инстанцирования своего интерфейса IDbConnection, вы можете создать свою собственную реализацию IDbConnection, отменяющий CreateCommand вернуть свою собственную реализацию IDbCommand, которая регистрирует ExecuteReader, ExecuteNonQuery и ExecuteScalar перед вызовом реальных основных объектов:

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

Теперь, где бы вы ни были ting вашего IDbConnection, верните новый MyDbConnection (theRealDbConnection) вместо этого ...

+0

src.CommandText не является полным sql-адресом, отправленным на сервер при наличии параметров. MyDbCommand отправит sql как выражение {sp_executesql, Parameter_types, Parameter_values} и зарегистрирует только журналы третьей информации без параметров. Я хочу поймать полный sp_executesql. Я могу составить его и войти в мой текущий DAL, но я хочу знать фактический SQL-запрос, посланный ado.net, который, как это описано в sql-профилировщике. Эта реализация не приведет к полному запросу SQl, отправленному на сервер. –

0

А, извините, я неправильно понял вопрос. Мой предыдущий ответ показал, как захватить то, что ваше приложение отправляло на клиентский сервер sql, а не то, что клиент SQL-сервера отправлял на сервер.

Чтобы захватить SQL-запросы, отправленные SQL-клиентом на сервер, вам необходимо будет использовать sp_trace_create и связанные с ними функции трассировки, чтобы настроить SQL-сервер для отправки информации о трассировке обратно в ваше приложение.

Эта статья TechNet может быть полезным для Вас: SQL Trace

 Смежные вопросы

  • Нет связанных вопросов^_^