c# – 如何在运行时访问(或生成)NHibernate Sql
我认为标题是相当自我解释的,但是给出一点背景.
我一直在阅读这个问题,但它并不完全符合我的用例 Intercept-sql-statements-containing-parameter-values-generated-by-nhibernate 我遇到的问题是我只想在发生异常(或时间段过去)时注销生成的SQL.这是为了使我们能够在非常复杂的应用程序中对一些长时间运行的查询进行故障排除.我不想拦截并记录所有查询,因为我相信会有性能影响. 在我想要记录它的时候,我有NHibernate使用的ICriteria对象,所以我正在寻找的是一种“虚拟”NHibernate对象,我可以触发这些ICriteria并获取SQL字符串(或者甚至带有占位符的SQL参数和参数列表). 所以存在这样做的事情(我认为它要么非常简单而且我错过了一些东西,或者它很难,没有其他人需要它). 如果它不存在,那么创建实现目标的东西的最佳方法是什么,而无需手动构建SQL(我希望尽可能接近执行的SQL).有没有办法直接进入NHibernate生成器并获取字符串? 添加到此以使其更清晰. 我想这样做“事后”,而不是拦截每个查询(由于性能问题).我也不想使用Log4Net这样做,因为我需要它来记录会话. 我认为必须有一种方法来创建第二个NHibernate对象,可能使用不同的驱动程序(一个不会进入数据库),这样我就可以实现拦截该对象的方法,而不是主对象这是持久的数据库 解决方法
如果您需要知道在有异常的情况下执行的查询,您可以使用检查异常的“数据”其他元素:
yourexception.Data["actual-sql-query"] 包含导致异常的查询.在序数操作中,您可以使用名为“NHibernate.SQL”的记录器,这是获取查询文本的最可靠方式,因为其他“直接”方法取决于您查询NH的方式(ICriteria,Hql,QueryOver),LinqTONh,SOmeNewWayNotYetImplemented …)所以拦截记录器通常更好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |