43

nHibernateによって生成されたSQLを表示するにはどうすればよいですか?バージョン1.2

4

10 に答える 10

44

app.config/web.config ファイルに次のようなものを入れることができます:

configSections ノードで:

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

構成ノードで:

<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>

そして、電話することを忘れないでください

log4net.Config.XmlConfigurator.Configure();

アプリケーションの起動時、または配置する

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

assemblyinfo.cs で

構成設定で、「show_sql」プロパティを true に設定します。

于 2008-09-24T20:38:28.580 に答える
20

私は知っている少し遅れていますが、これはトリックを行い、ツール/データベース/フレームワークに依存しません。これらの有効なオプションの代わりに、NH Interceptorsを使用します。

最初に、 NHibernate.EmptyInterceptorを拡張し、 NHibernate.IInterceptorを実装するクラスを実装します。

using NHibernate;

namespace WebApplication2.Infrastructure
{
    public class SQLDebugOutput : EmptyInterceptor, IInterceptor
    {
        public override NHibernate.SqlCommand.SqlString
           OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
        {
            System.Diagnostics.Debug.WriteLine("NH: " + sql);

            return base.OnPrepareStatement(sql);
        }
    }
}

次に、セッションを開いたときにインスタンスを渡すだけです。DEBUG の場合にのみ実行してください。

public static void OpenSession() {

#if DEBUG
    HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession(new SQLDebugOutput());

#else
    HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession();
            
#endif
}

以上です。

これからは、これらのようなSQLコマンド...

 var totalPostsCount = Database.Session.Query<Post>().Count();
 
 var currentPostPage = Database.Session.Query<Post>()
        .OrderByDescending(c => c.CreatedAt)
        .Skip((page - 1) * PostsPerPage)
        .Take(PostsPerPage)
        .ToList();

.. 出力ウィンドウにそのまま表示されます。

NH: 投稿 post0_ から cast(count(*) as INT) as col_0_0_ を選択

NH: Id3_ として post0_.Id、user2_3_ として post0_.user_id、Title3_ として post0_.Title、Slug3_ として post0_.Slug、Content3_ として post0_.Content、created6_3_ として post0_.created_at、updated7_3_ として post0_.updated_at、post0_.deleted_at として deleted8_3_ として post0_.Id を選択します。投稿から post0_ order by post0_.created_at des limit ? オフセット?

于 2016-04-20T02:54:28.033 に答える
18

構成設定で、「show_sql」プロパティをtrueに設定します。これにより、log4netのおかげでSQLがNHibernateのログファイルに出力されます。

于 2008-09-24T19:02:03.070 に答える
6

SQLサーバープロファイラーを使用します。

編集(1年後):@ Toran Billupsが以下に述べているように、NHibernateプロファイラーAyendeは非常にクールです。

于 2008-09-24T19:00:03.107 に答える
3

NHibernate のロギングについては、How to configure Log4Net for use with NHibernate に参考文献があります。NHibernate によって生成されたすべての SQL ステートメントのログ記録に関する情報が含まれています。

于 2008-09-24T19:04:37.183 に答える
1

SQL Server (Express ではない) を使用している場合は、SQL Server Profiler を試すことができます。

于 2014-07-31T18:01:17.080 に答える