How do I view the SQL that is generated by nHibernate?

前端 未结 9 2081
Happy的楠姐
Happy的楠姐 2020-12-03 00:41

How do I view the SQL that is generated by nHibernate? version 1.2

相关标签:
9条回答
  • 2020-12-03 01:09

    If you're using SQL Server (not Express), you can try SQL Server Profiler.

    0 讨论(0)
  • 2020-12-03 01:19

    You can put something like this in your app.config/web.config file :

    in the configSections node :

    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    

    in the configuration node :

    <log4net>
      <appender name="NHibernateFileLog" type="log4net.Appender.FileAppender">
        <file value="logs/nhibernate.txt" />
        <appendToFile value="false" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n"  />
        </layout>
      </appender>
      <logger name="NHibernate.SQL" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="NHibernateFileLog"/>
      </logger>
    </log4net>
    

    And don't forget to call

    log4net.Config.XmlConfigurator.Configure();
    

    at the startup of your application, or to put

    [assembly: log4net.Config.XmlConfigurator(Watch=true)]
    

    in the assemblyinfo.cs

    In the configuration settings, set the "show_sql" property to true.

    0 讨论(0)
  • 2020-12-03 01:24

    There is a good reference for NHibernate logging at: How to configure Log4Net for use with NHibernate. It includes info on logging all NHibernate-generated SQL statements.

    0 讨论(0)
  • 2020-12-03 01:26

    Nhibernate Profiler is an option, if you have to do anything serious.

    0 讨论(0)
  • 2020-12-03 01:31

    Use sql server profiler.

    EDIT (1 year later): As @Toran Billups states below, the NHibernate profiler Ayende wrote is very very cool.

    0 讨论(0)
  • 2020-12-03 01:31

    Or, if you want to show the SQL of a specific query, use the following method (slightly altered version of what suggested here by Ricardo Peres) :

    private String NHibernateSql(IQueryable queryable)
    {
      var prov = queryable.Provider as DefaultQueryProvider;
      var session = prov.Session as ISession;
    
      var sessionImpl = session.GetSessionImplementation();
      var factory = sessionImpl.Factory;
      var nhLinqExpression = new NhLinqExpression(queryable.Expression, factory);
      var translatorFactory = new NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory();
      var translator = translatorFactory.CreateQueryTranslators(nhLinqExpression, null, false, sessionImpl.EnabledFilters, factory).First();
      var sql = translator.SQLString;
    
      var parameters = nhLinqExpression.ParameterValuesByName;
      if ( (parameters?.Count ?? 0) > 0)
      {
        sql += "\r\n\r\n-- Parameters:\r\n";
        foreach (var par in parameters)
        {
          sql += "-- " + par.Key.ToString() + " - " + par.Value.ToString() + "\r\n";
        }
      }
    
      return sql;
    }
    

    and pass to it a NHibernate query, i.e.

    var query = from a in session.Query<MyRecord>()
      where a.Id == "123456" 
      orderby a.Name
      select a;
    
    var sql = NHibernateSql(query);
    
    0 讨论(0)
提交回复
热议问题