C# 从nHibernate获取执行的SQL
我正在使用nHibernate-ICriteria执行一个查询,我希望能够获得在语句运行后执行的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
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语句呢?调用。请求。。。?