2008-08-27 6 views
7

En el podcast herding code 14 alguien menciona que stackoverflow muestra las consultas que se ejecutaron durante una solicitud en la parte inferior de la página.Cómo rastrear consultas en un DataContext Linq-a-sql

Me parece una excelente idea. Cada vez que se carga una página, quiero saber qué sentencias SQL se ejecutan y también un recuento de la cantidad total de viajes de ida y vuelta. ¿Alguien tiene una solución clara para este problema?

¿Cuál cree que es un número aceptable de consultas? Estaba pensando que, durante el desarrollo, podría hacer que mi aplicación arrojara una excepción si se requieren más de 30 consultas para representar una página.

EDIT: Creo que no debo haber explicado mi pregunta claramente. Durante una solicitud HTTP, una aplicación web puede ejecutar una docena o más sentencias SQL. Quiero que esas declaraciones se agreguen al final de la página, junto con un recuento del número de declaraciones.

está aquí mi solución:

creé una clase TextWriter que el DataContext puede escribir a:

public class Logger : StreamWriter 
    { 
     public string Buffer { get; private set; } 
     public int QueryCounter { get; private set; } 

     public Logger() : base(new MemoryStream()) 
     {} 

     public override void Write(string value) 
     { 
      Buffer += value + "<br/><br/>"; 
      if (!value.StartsWith("--")) QueryCounter++; 
     } 

     public override void WriteLine(string value) 
     { 
      Buffer += value + "<br/><br/>"; 
      if (!value.StartsWith("--")) QueryCounter++; 
     } 
    } 

En la configuración constructor I de la DataContext el registrador:

public HeraldDBDataContext() 
     : base(ConfigurationManager.ConnectionStrings["Herald"].ConnectionString, mappingSource) 
    { 
     Log = new Logger(); 
    } 

Por último, Uso el evento Application_OnEndRequest para agregar los resultados a la parte inferior de la página:

protected void Application_OnEndRequest(Object sender, EventArgs e) 
    { 
     Logger logger = DataContextFactory.Context.Log as Logger; 
     Response.Write("Query count : " + logger.QueryCounter); 
     Response.Write("<br/><br/>"); 
     Response.Write(logger.Buffer); 
    } 

Respuesta

3

Si pones .ToString() en una variable de consulta var, obtienes el sql. Puedes usarlo en Debug en VS2008. Debug Visualizer

ejemplo:

var query = from p in db.Table 
      select p; 

MessageBox.SHow(query.ToString()); 
3
System.IO.StreamWriter httpResponseStreamWriter = 
new StreamWriter(HttpContext.Current.Response.OutputStream); 

dataContext.Log = httpResponseStreamWriter; 

Stick eso en su página y obtendrá la SQL descartado en la página. Obviamente, envolveré eso en un pequeño método que puedes habilitar/deshabilitar.

+0

Nos ayudó a obtener: Db.Log = Console.Out; – Haroon

Cuestiones relacionadas