2009-08-12 4 views
8

Ich benutze nHibernate ICriteria, um eine Abfrage auszuführen, und ich möchte in der Lage sein, die SQL, die ausgeführt wurde, nachdem die Anweisung ausgeführt wird. Also zum Beispiel habe ich so etwas.Get executed SQL von nHibernate

ISession session = NHibernateSessionManager.Instance.GetSession(); 
DetachedCriteria query = BuildCriteria(); // Goes away and constructs the ICriteria 
var result = query.GetExecutableCriteria(session).List<object>() 

// somehow here get the sql that was just run 
string sql = query.GetSqlSomehow(); 

Ich weiß, dass ich es anmelden und die SQL im Protokoll sehen, aber ich möchte es erhalten sofort nach der Ausführung der Anweisung, damit ich die SQL für den Benutzer angezeigt werden kann (auch wenn es nicht schön aussieht).

+0

http://stackoverflow.com/questions/10704462/how-can-i-have-nhibernate-only-generate-the-sql-without-executing-it –

Antwort

10

Sie können eine IInterceptor an Ihre NH ISession anhängen, dann verwenden Sie die OnPrepareStatement()-Methode, um die SQL-Abfrage (even modify).

+0

Ich mag Diese Methode und iv implementiert die Interception-Logik und abfangen derzeit die SaveOrUpdate-Methode, aber wo gehe ich von dort die SQL-Anweisung zu fangen? Aufruf.Anfrage ...? – furier

0

Persönlich verwende ich das "NHibernate Profiler" Werkzeug dafür. Es ist den Preis wert, da es auch einen guten Job bei der Analyse Ihrer Verwendung von NHibernate und der Erkennung potentieller Probleme leistet.

+0

Ich weiß, NHibernate Profiler ist gut in dem, was es tut, aber wenn Sie die Frage erneut lesen, bin ich nicht nach einem Profiler oder auf der Suche nach möglichen Problemen. – Craig

+0

Ahhh also müssen Sie das SQL zur Laufzeit sehen? Ich dachte, Sie wollten nur das SQL sehen, für das ich NHProf die meiste Zeit nutze. –

2

Sie können die Log4Net-Konfiguration verwenden, um das verwendete SQL zu erfassen. So starten Sie einen benutzerdefinierten appender erstellen, wie dies würden müssen:

using System; 
using System.Collections.Generic; 
using log4net.Appender; 
using log4net.Core; 

public class NHibernateQueryAppender : AppenderSkeleton 
{ 
     private static List<string> s_queries = new List<string>(); 
    private static int s_queryCount = 0; 

    public static IList<string> CurrentQueries 
    { 
      get { return s_queries.AsReadOnly(); } 
    } 

    public static int CurrentQueryCount 
    { 
     get { return s_queryCount; } 
    } 

    public static void Reset() 
    { 
     s_queryCount = 0; 
     s_queries.Clear(); 
    } 

    protected override void Append(LoggingEvent loggingEvent) 
    { 
     s_queries.Add(loggingEvent.RenderedMessage); 
     s_queryCount++; 
    } 
} 

Dann wie so konfigurieren log4net:

<log4net> 
    <...other config...> 

    <appender name="nhquerycheck" type="NHibernateExecutor.Loggers.NHibernateQueryAppender, NHibernateExecutor" /> 

    <logger name="NHibernate.SQL"> 
     <level value="DEBUG"/> 
     <appender-ref ref="nhquerycheck" /> 
    </logger> 
</log4net> 

Die obige Klasse kann dann zur Laufzeit abgefragt werden wie um die sql-Ausgabe auf dem Bildschirm anzuzeigen


Edit: aus irgendeinem Grund Post kam nicht richtig ly, fand so beispielsweise auf Web http://nhforge.org/blogs/nhibernate/archive/2008/09/06/how-to-configure-log4net-for-use-with-nhibernate.aspx