记录NHibernate SQL查询

时间:2010-02-04 10:24:16

标签: c# .net nhibernate

有没有办法在我的代码中访问完整的SQL查询,包括值?

我可以使用log4net记录SQL查询:

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

但是,我想找到一种从代码中记录SQL查询的方法。这样我将在try / catch语句中记录导致异常的特定SQL查询。

现在我必须对SQLFileLog进行数据挖掘,以便在发生异常时查找导致异常的查询并且效率不高。

4 个答案:

答案 0 :(得分:9)

您可以使用拦截器执行此操作:

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

        Debug.WriteLine(sql);

        return sql;
    }
}

有关使用nhibernate注册它的不同方法,请参阅Nhibernate Docs

答案 1 :(得分:6)

您可以覆盖驱动程序:

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

然后在配置中使用它:

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

答案 2 :(得分:4)

使用sql profiler或查看http://nhprof.com/

处的nhprof

两者都可以让你看到sql输出。

还在hibernate配置文件中设置show_sql属性

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

答案 3 :(得分:1)

使用具有特定目标的log4net appender(它支持切换打开/关闭)或者只是扩展它并在try-catch-finally-off中切换它。