2010-02-04 19 views
8

¿Hay alguna manera de acceder a la consulta SQL completa, incluidos los valores, dentro de mi código?Registro NHibernate Consultas SQL

soy capaz de registrar las consultas SQL usando log4net:

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

Sin embargo, me gustaría encontrar una manera de registrar las consultas SQL del código también. De esta manera, registraré la consulta SQL específica que causa una excepción en mi declaración try/catch.

Ahora tengo que extraer los datos de SQLFileLog para encontrar la consulta que provocó la excepción cuando se produce una excepción y no es eficiente.

+0

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

Respuesta

3

De cualquier uso de SQL o echar un vistazo a nhprof en http://nhprof.com/

Tanto le permitirá ver la salida del sql.

También establezca la propiedad show_sql en hibernación archivo de configuración

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

Lo uso en el código 'configuration = new Cfg.Configuration(); configuration.SetProperty (Cfg.Environment.ShowSql, "true"); _sessionFactory = configuration.BuildSessionFactory(); log4net.Config.XmlConfigurator.Configure(); 'pero no funciona – Kiquenet

1

Utilice un appender log4net con objetivo específico (AFAIR soporta la que se alternará de encendido/apagado) o simplemente extenderlo y alternar dentro de su try-Catch finalmente, fuera.

8

puede utilizar un interceptor de hacer esto:

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

     Debug.WriteLine(sql); 

     return sql; 
    } 
} 

Ver Nhibernate Docs para las diferentes formas de registrar con NHibernate.

+8

es posible capturar el valor de los parámetros? –

+0

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors not found, ¿alguna muestra que use 'LoggingInterceptor'? – Kiquenet

+0

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

5

Puede anular conductor:

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

y luego usarlo en la configuración:

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