2010-02-04 185 views
8

有沒有辦法在我的代碼中訪問完整的SQL查詢,包括值?記錄NHibernate的SQL查詢

我能夠使用log4net的登錄SQL查詢:

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

不過,我想找到一種方法,從代碼中還記錄SQL查詢。這樣我將記錄在我的try/catch語句中導致異常的特定SQL查詢。

現在我必須數據挖掘SQLFileLog來查找異常發生時導致異常的查詢並且效率不高。

+0

重複:http://stackoverflow.com/questions/1264132/get-executed-sql-from -nhibernate – 2010-02-04 13:21:36

回答

3

無論是使用SQL事件探查器或看看nhprof在http://nhprof.com/

都將讓你看到SQL輸出。

而且設置在Hibernate配置文件

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

我在代碼中使用它'configuration = new Cfg.Configuration(); configuration.SetProperty(Cfg.Environment.ShowSql,「true」); _sessionFactory = configuration.BuildSessionFactory(); log4net.Config.XmlConfigurator.Configure();'但不能正常工作 – Kiquenet 2016-05-10 14:20:34

1

使用log4net的Appender的具體目標show_sql財產(AFAIR它支持被打開/關閉)或只是延長它和你的try-catch-內將其切換最後關閉。

8

您可以使用攔截器來做到這一點:

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

     Debug.WriteLine(sql); 

     return sql; 
    } 
} 

爲不同的方式與NHibernate註冊它見Nhibernate Docs

+8

是否可以捕獲參數值? – 2011-01-11 05:46:19

+0

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors not found,any sample using LoggingInterceptor'? – Kiquenet 2016-05-10 14:22:54

+0

http://nhibernate.info/doc/nhibernate-reference/events.html – 2016-08-17 13:44:28

5

您可以覆蓋駕駛員:

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>();