有没有办法在我的代码中访问完整的SQL查询,包括值?
我可以使用log4net记录SQL查询:
<logger name="NHibernate.SQL" additivity="false">
<level value="ALL"/>
<appender-ref ref="NHibernateSQLFileLog"/>
</logger>
但是,我想找到一种从代码中记录SQL查询的方法。这样我将在try / catch语句中记录导致异常的特定SQL查询。
现在我必须对SQLFileLog进行数据挖掘,以便在发生异常时查找导致异常的查询并且效率不高。
答案 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中切换它。