从nHibernate获取执行的SQL

我正在使用nHibernate ICriteria来执行查询,我希望能够获得在语句运行后执行的SQL。 所以例如我有类似的东西。

ISession session = NHibernateSessionManager.Instance.GetSession(); DetachedCriteria query = BuildCriteria(); // Goes away and constructs the ICriteria var result = query.GetExecutableCriteria(session).List() // somehow here get the sql that was just run string sql = query.GetSqlSomehow(); 

我知道我可以记录它并在日志中看到sql,但我想在执行语句后立即获取它,这样我就可以向用户显示SQL(即使它看起来不太好)。

您可以将IInterceptor连接到NH ISession ,然后使用OnPrepareStatement()方法来捕获(甚至修改 )SQL。

您可以使用Log4Net配置捕获正在使用的SQL。 首先,您需要创建一个自定义appender,如下所示:

 using System; using System.Collections.Generic; using log4net.Appender; using log4net.Core; public class NHibernateQueryAppender : AppenderSkeleton { private static List s_queries = new List(); private static int s_queryCount = 0; public static IList 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++; } } 

然后像这样配置log4net:

  <...other config...>       

然后可以在运行时查询上面的类,例如将sql输出显示到屏幕


编辑:由于某种原因,post没有正确发布,所以在网站上找到了例子http://nhforge.org/blogs/nhibernate/archive/2008/09/06/how-to-configure-log4net-for-use-与-nhibernate.aspx

就个人而言,我使用“NHibernate Profiler”工具。 这非常值得,因为它也很好地分析了你对NHibernate的使用并注意到了潜在的问题。