我使用一个简单的拦截器来拦截nhibernate为记录目的而生成的sql字符串,它工作正常。拦截包含由NHibernate生成的参数值的SQL语句
public class SessionManagerSQLInterceptor : EmptyInterceptor, IInterceptor
{
NHibernate.SqlCommand.SqlString IInterceptor.OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
{
NHSessionManager.Instance.NHibernateSQL = sql.ToString();
return sql;
}
}
然而这却捕获了没有参数值的sql语句。它们被替换为'?'
例如:.... WHERE USER0_.USERNAME =?
唯一的替代办法,我发现到目前为止使用log4nets nhibernate.sql的appender它记录SQL语句,包括参数值,但不服务我好..
我需要使用的拦截器,这样对于如。当我捕捉到一个异常时,我想记录导致持久性问题的特定sql语句,包括它包含的值并记录它的邮件等等。与进入日志文件寻找导致问题的查询相比,这加快了调试速度..
如何获取完整的sql语句,包括nhibernate在运行时生成的参数值?
您如何知道生成的异常总是与正在运行的sql语句相关?另外,您似乎可以将您的sql语句日志记录集成到常规的nhibernate日志文件中,并且如果您已经生成了与datestamp/timestamp一起生成的异常,则查找sql语句不会很难。 – 2011-05-18 21:04:17
我不知道,这是没有必要的,因为异常是默认情况下记录和SQL语句是另外,以防万一..查找日志和查找从时间戳查询正是我想要避免.. – kaivalya 2011-05-18 23:37:46