Frage Protokollieren von NHibernate SQL-Abfragen


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

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>

Ich würde jedoch gerne eine Möglichkeit finden, SQL-Abfragen auch aus dem Code zu protokollieren. Auf diese Weise protokolliere ich die spezifische SQL-Abfrage, die eine Ausnahme in meiner try / catch-Anweisung verursacht.

Im Moment muss ich SQLFileLog abfragen, um die Abfrage zu finden, die die Ausnahme verursachte, wenn eine Ausnahme auftritt und nicht effizient ist.


9
2018-02-04 10:24


Ursprung


Antworten:


Sie können dazu einen Interceptor verwenden:

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

        Debug.WriteLine(sql);

        return sql;
    }
}

Sehen Nhibernate Docs für die verschiedenen Möglichkeiten, es mit Nhibernate zu registrieren.


9
2018-05-20 13:16



Sie können den Treiber überschreiben:

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 benutze es in der Konfiguration:

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

5
2017-07-24 11:40



Verwenden Sie entweder sql profiler oder werfen Sie einen Blick auf nhprof at http://nhprof.com/

Beide lassen Sie sql Ausgabe sehen.

Legen Sie außerdem die show_sql-Eigenschaft in der Hibernate-Konfigurationsdatei fest

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

4
2018-02-12 19:09



Verwenden Sie einen log4net-Appender mit einem bestimmten Ziel (sofern er unterstützt wird, ein- / ausgeschaltet zu werden) oder erweitern Sie ihn einfach und schalten Sie ihn innerhalb Ihrer try-catch-finally-off-Funktion um.


1
2018-03-31 22:29