2010-02-04 7 views
8

Existe-t-il un moyen d'accéder à la requête SQL complète, y compris les valeurs, dans mon code?Enregistrement des requêtes SQL NHibernate

Je suis en mesure d'enregistrer les requêtes SQL en utilisant log4net:

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

Cependant, je voudrais trouver un moyen d'enregistrer les requêtes SQL à partir du code aussi. De cette façon, je vais enregistrer la requête SQL spécifique qui provoque une exception dans mon instruction try/catch.

Pour le moment, je dois extraire les données de SQLFileLog pour trouver la requête à l'origine de l'exception lorsqu'une exception se produit et qu'elle n'est pas efficace.

+0

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

Répondre

3

soit l'utilisation ou profileur sql un coup d'oeil à nhprof à http://nhprof.com/

deux vous permettra de voir la sortie sql.

également définir la propriété show_sql dans le fichier de configuration de mise en veille prolongée

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

Je l'utilise dans le code 'configuration = new Cfg.Configuration(); configuration.SetProperty (Cfg.Environment.ShowSql, "true"); _sessionFactory = configuration.BuildSessionFactory(); log4net.Config.XmlConfigurator.Configure(); 'mais ne fonctionne pas – Kiquenet

1

Utilisez un appender log4net avec l'objectif spécifique (AFAIR il accepte d'être activé/désactivé) ou d'étendre juste et l'activer au sein de votre essai-rattrapage enfin-off.

8

vous pouvez utiliser un intercepteur pour ce faire:

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

     Debug.WriteLine(sql); 

     return sql; 
    } 
} 

Voir Nhibernate Docs pour les différentes façons d'enregistrer avec NHibernate.

+8

est possible de capturer la valeur des paramètres? –

+0

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors non trouvé, tout échantillon utilisant 'LoggingInterceptor'? – Kiquenet

+0

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

5

Vous pouvez remplacer le pilote:

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

Et puis utilisez dans la configuration:

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