2010-02-04 20 views
8

Kodum içinde değerler de dahil olmak üzere tam SQL sorgusuna erişmenin bir yolu var mı?Günlük NHibernate SQL sorguları

ben log4net kullanarak SQL sorguları giriş yapabiliyor duyuyorum:

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

Ancak, ben de kodundan SQL sorguları oturum için bir yol bulmak istiyoruz. Bu şekilde, try/catch ifademde bir istisna neden olan belirli SQL sorgusunu günlüğe kaydedeceğim.

Şu anda, bir istisna oluştuğunda ve verimli olmadığında istisnaya neden olan sorguyu bulmak için SQLFileLog verilerini veri-mine'ye almam gerekiyor.

+0

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

cevap

3

Ya kullanımı sql profiler veya sql çıktısını görelim http://nhprof.com/

İkisi de nhprof de bakabilirsiniz.

Ayrıca hazırda yapılandırma dosyasında

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

Kodda kullanıyorum 'configuration = yeni Cfg.Configuration(); configurationSetProperty (Cfg.Environment.ShowSql, "true"); _sessionFactory = configuration BuildSessionFactory(); log4net.Config.XmlConfigurator.Configure(); 'ama çalışmıyor – Kiquenet

1

Kullanım belirli hedef ile bir log4net appender içinde show_sql özelliğini ayarlayın (bunu bir adil açık/kapalı getirildiğinde destekler) ya da sadece uzatmak ve deneme-yakala bırak içinde onu açınız nihayet-off.

8

Bunu yapmak için bir önleme kullanabilirsiniz:

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

     Debug.WriteLine(sql); 

     return sql; 
    } 
} 

nhibernate ile kaydetmek için farklı yollardan için Nhibernate Docs bakınız.

+8

parametre değeri yakalamak mümkün mü? –

+0

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors bulunamadı, 'LoggingInterceptor' kullanarak herhangi bir örnek? – Kiquenet

+0

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

5

Sen sürücü geçersiz kılabilirsiniz:

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

Sonra yapılandırmasında kullanmak:

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