微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 …)所以拦截记录器通常更好.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐