2010-02-04 8 views
8

Gibt es eine Möglichkeit, auf die vollständige SQL-Abfrage einschließlich der Werte in meinem Code zuzugreifen?Protokollieren von NHibernate SQL-Abfragen

Ich bin in der Lage SQL-Abfragen mit log4net zu protokollieren:

<logger name="NHibernate.SQL" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="NHibernateSQLFileLog"/> 
</logger> 

Allerdings würde Ich mag einen Weg finden, auch SQL-Abfragen aus dem Code zu protokollieren. Auf diese Weise protokolliere ich die spezifische SQL-Abfrage, die eine Ausnahme in meiner try/catch-Anweisung verursacht.

Jetzt muss ich Data-Mining der SQLFileLog, um die Abfrage zu finden, die die Ausnahme verursachte, wenn eine Ausnahme auftritt und es nicht effizient ist.

+0

Duplikat: http://stackoverflow.com/questions/1264132/get-executed-sql-from -nhibernate –

Antwort

3

Entweder Verwendung von SQL Profiler oder haben einen Blick auf nhprof bei http://nhprof.com/

Beide lassen Sie SQL-Ausgabe.

setzen auch die show_sql Eigenschaft in Hibernate-Konfigurationsdatei

<property name="show_sql">true</property> 
+0

Ich benutze es in Code 'configuration = new Cfg.Configuration(); configuration.SetProperty (Cfg.Environment.ShowSql, "true"); _sessionFactory = Konfiguration.BuildSessionFactory(); log4net.Config.XmlConfigurator.Configure(); 'aber nicht funktioniert – Kiquenet

1

Verwenden Sie ein log4net Appender mit spezifischen Ziel (AFAIR es unterstützt ein/aus umgeschaltet wird) oder es nur verlängern und schalten es in Ihrem Try-Fang- endlich aus.

8

können Sie einen Abfangjäger, dies zu tun:

public class LoggingInterceptor : EmptyInterceptor { 
    public override SqlString OnPrepareStatement(SqlString sql) { 

     Debug.WriteLine(sql); 

     return sql; 
    } 
} 

Nhibernate Docs für die verschiedenen Möglichkeiten finden Sie es mit nhibernate zu registrieren.

+8

ist es möglich, Parameterwert zu erfassen? –

+0

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors nicht gefunden, irgendein Beispiel mit 'LoggingInterceptor'? – Kiquenet

+0

http://nhibernate.info/doc/nhibernate-reference/events.html –

5

können Sie außer Kraft setzen Treiber:

public class LoggerSqlClientDriver:SqlClientDriver, IEmbeddedBatcherFactoryProvider 
{  
    public override void AdjustCommand(IDbCommand command) 
    { 
     //log here 
     base.AdjustCommand(command); 
    } 

    //protected override void OnBeforePrepare(IDbCommand command) 
    //{ 
    // //log here 
    // base.OnBeforePrepare(command); 
    //} 
} 

Und dann in der Konfiguration verwenden es:

var config = Fluently.Configure(). 
      Database(MsSqlConfiguration.MsSql2005.Driver<LoggerSqlClientDriver>(); 
Verwandte Themen