Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从nHibernate获取执行的SQL_C#_Nhibernate - Fatal编程技术网

C# 从nHibernate获取执行的SQL

C# 从nHibernate获取执行的SQL,c#,nhibernate,C#,Nhibernate,我正在使用nHibernate-ICriteria执行一个查询,我希望能够获得在语句运行后执行的SQL。举个例子,我有这样的东西 ISession session = NHibernateSessionManager.Instance.GetSession(); DetachedCriteria query = BuildCriteria(); // Goes away and constructs the ICriteria var result = query.GetExecutableCr

我正在使用nHibernate-ICriteria执行一个查询,我希望能够获得在语句运行后执行的SQL。举个例子,我有这样的东西

ISession session = NHibernateSessionManager.Instance.GetSession();
DetachedCriteria query = BuildCriteria(); // Goes away and constructs the ICriteria
var result = query.GetExecutableCriteria(session).List<object>()

// somehow here get the sql that was just run
string sql = query.GetSqlSomehow();
ISession session=NHibernateSessionManager.Instance.GetSession(); DetachedCriteria查询=BuildCriteria();//去建造ICriteria var result=query.GetExecutableCriteria(会话).List() //不知怎的,这里得到了刚刚运行的sql 字符串sql=query.getsqlname();
我知道我可以记录它并在日志中看到sql,但我想在执行语句后立即获取它,这样我就可以向用户显示sql(即使它看起来不好看)。

您可以在NH
会话上附加一个
IInterceptor
,然后使用
OnPrepareStatement()
捕获SQL的方法。

我个人使用“NHibernate Profiler”工具进行此操作。它的价格非常划算,因为它还可以很好地分析您对NHibernate的使用情况并注意到潜在的问题。

您可以使用Log4Net配置来捕获正在使用的SQL。 要开始,您需要创建一个自定义追加器,如下所示:

using System;
using System.Collections.Generic;
using log4net.Appender;
using log4net.Core;

public class NHibernateQueryAppender : AppenderSkeleton
{
        private static List<string> s_queries = new List<string>();
    private static int s_queryCount = 0;

    public static IList<string> CurrentQueries
    {
           get { return s_queries.AsReadOnly(); }
    }

    public static int CurrentQueryCount
    {
        get { return s_queryCount; }
    }

    public static void Reset()
    {
        s_queryCount = 0;
        s_queries.Clear();
    }

    protected override void Append(LoggingEvent loggingEvent)
    {
        s_queries.Add(loggingEvent.RenderedMessage);
        s_queryCount++;
    }
}
使用系统;
使用System.Collections.Generic;
使用log4net.Appender;
使用log4net.Core;
公共类NHibernateQueryAppender:AppenderSkeleton
{
私有静态列表s_查询=新列表();
私有静态int s_queryCount=0;
公共静态IList查询
{
获取{return s_querys.AsReadOnly();}
}
公共静态int CurrentQueryCount
{
获取{return s_queryCount;}
}
公共静态无效重置()
{
s_queryCount=0;
s_querys.Clear();
}
受保护的覆盖无效附加(LoggingEvent LoggingEvent)
{
添加(loggingEvent.RenderMessage);
s_queryCount++;
}
}

然后按如下方式配置log4net:

<log4net>
    <...other config...>

    <appender name="nhquerycheck" type="NHibernateExecutor.Loggers.NHibernateQueryAppender, NHibernateExecutor" />

    <logger name="NHibernate.SQL">
        <level value="DEBUG"/>
        <appender-ref ref="nhquerycheck" />
    </logger>
</log4net>


我意识到NHibernate探查器在这方面做得很好,但是如果你再看一遍这个问题,我就不会去找探查器或寻找潜在的问题。啊,那么你需要在运行时查看SQL?我想你只是想看看实际的SQL,我大部分时间都在使用NHProf。我喜欢这个方法,iv实现了截取逻辑,目前截取了SaveOrUpdate方法,但是我从那里去哪里捕捉SQL语句呢?调用。请求。。。?