2010-02-04 11 views
8

Czy istnieje sposób dostępu do pełnego zapytania SQL, w tym wartości, w moim kodzie?Rejestrowanie zapytań NHibernate SQL

jestem w stanie zalogować zapytań SQL przy użyciu log4net:

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

Jednak chciałbym, aby znaleźć sposób, aby się zalogować zapytań SQL z kodu również. W ten sposób będę logował konkretne zapytanie SQL, które powoduje wyjątek w moim poleceniu try/catch.

Teraz muszę wydobywać dane z SQLFileLog, aby znaleźć zapytanie, które spowodowało wyjątek, gdy wystąpi wyjątek i nie jest wydajne.

+0

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

Odpowiedz

3

Albo użycie SQL Profiler lub rzucić okiem na nhprof w http://nhprof.com/

Both pozwoli Ci zobaczyć wyjście SQL.

ustawić także właściwość show_sql w hibernacji pliku konfiguracyjnym

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

Używam go w kodzie 'configuration = new Cfg.Configuration(); configuration.SetProperty (Cfg.Environment.ShowSql, "true"); _sessionFactory = configuration.BuildSessionFactory(); log4net.Config.XmlConfigurator.Configure(); 'ale nie działa – Kiquenet

1

Skorzystaj z appender log4net z konkretnym celu (afair Obsługuje jest przełączana on/off) lub po prostu przedłużyć go i włączyć go w swoim try-catch- wreszcie-wyłączony.

8

można użyć do przechwytywania to zrobić:

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

     Debug.WriteLine(sql); 

     return sql; 
    } 
} 

Zobacz Nhibernate Docs dla różnych sposobów, aby zarejestrować go z NHibernate.

+8

jest możliwe przechwycenie wartości parametrów? –

+0

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors nie znaleziono, każda próbka używająca 'LoggingInterceptor'? – Kiquenet

+0

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

5

Można zastąpić kierowca:

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); 
    //} 
} 

a następnie używać go w konfiguracji:

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