2016-07-21 23 views
0

Ich möchte wissen, welche SQL-Anweisung an den Server von meinem ado.net basierte Anwendung für die Protokollierung von Ausnahmen und Debugging gesendet. Ich benutze generische DAL, die MS SQL-Verbindungsanbieter handhaben.Was SQL-Anweisung an den Server von Ado.net-Anwendung (MS SQL-Provider) gesendet

fand ich diese Abfrage während SO suchen:

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 

Referenz: SQL Server Query Trace

und viele andere in SO

Dieser Code SQL-Abfragen können fangen, wenn sie aus SSMS ausgeführt werden (SQL Server Management Studio)

aber kann keine Abfragen, wenn sie von meiner Ado.net-Anwendung mit MS sql d verbunden gesendet werden Atabase-Server.

Meine Frage:

Warum ich keine Abfragen fangen können, wenn sie von Ado.net basierte Anwendung mit diesem Code gesendet werden?

Gibt es andere Art und Weise (SQL-Code/C# -Code) die tatsächlichen SQL-Anweisungen aus meiner Anwendung geschickt zu fangen (wie das, was ich in SQL PROFI bekommen)

+1

Die Abfrage eine Abfrage finden, die zwischengespeichert wird, unabhängig davon, wie ausgeführt. Daher wird die Abfrage möglicherweise nicht zwischengespeichert oder gelöscht, bevor die DMV-Abfrage ausgeführt wurde. Verwenden Sie zu diesem Zweck keine DMVs, sondern eine Ablaufverfolgung mit erweiterten Ereignissen oder SQL-Ablaufverfolgung (Profiler). –

+0

SQL Profiler benötigen Online-Interaktion, ich brauche etwas Code für die Protokollierung –

+0

Sie können die Ablaufverfolgung aus dem Profiler für die unbeaufsichtigte serverseitige Ablaufverfolgung aus dem Profiler-Datei -> Export -> Script Trace Definition-Menü. Ändern Sie das Skript, um das gewünschte Dateinamensmuster, die Dateigröße, den Rollover usw. anzugeben. –

Antwort

1

Wenn Ihr DAL ist die abstrakte IDbConnection und IDbCommand Schnittstellen, und Sie eine gemeinsame Fabrik für Ihre IDbConnection instanziiert wird, könnten Sie Ihre eigene Implementierung von IDbConnection erstellen, die Createüberschreibt eine eigene Implementierung von IDbCommand zurückzukehren, die protokolliert ExecuteReader, ExecuteNonQuery und ExecuteScalar bevor die realen zugrunde liegenden Objekte aufrufen:

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

Jetzt, wo auch immer du kreativ warst Ting Ihre IDbConnection, Rückgabe neuer MyDbConnection (theRealDbConnection) statt ...

+0

src.CommandText ist nicht die vollständige sql an den Server gesendet, wenn es Parameter gibt. MyDbCommand sendet sql als {sp_executesql-Anweisung, Parameter_types, Parameter_values} und protokolliert nur die dritte Information ohne Parameter. Ich möchte die vollständige sp_executesql abfangen. Ich kann es komponieren und meine aktuelle DAL anmelden, aber ich möchte die tatsächliche sql-Abfrage wissen, die von ado.net gesendet wird, die von sql profiler tool erfasst wird. Diese Implementierung wird nicht die vollständige SQl-Abfrage erzeugen, die an den Server gesendet wird. –

0

Ah, Entschuldigung, ich habe die Frage missverstanden. Meine vorherige Antwort zeigte, wie Sie erfassen, was Ihre App an den SQL-Client gesendet hat und nicht, was der SQL-Client an den Server gesendet hat.

Um SQL-Anweisungen zu erfassen, die vom SQL-Client an den Server gesendet werden, müssen Sie sp_trace_create und zugehörige Ablaufverfolgungsfunktionen verwenden, um den SQL-Server so zu konfigurieren, dass die Ablaufverfolgungsinformationen an Ihre Anwendung gesendet werden.

Dieser technet Artikel können Sie hilfreich sein: SQL Trace