gpt4 book ai didi

c# - 如何在运行时访问(或生成)NHibernate Sql

转载 作者:行者123 更新时间:2023-11-30 12:50:08 27 4
gpt4 key购买 nike

我认为这个标题是不言自明的,但要提供一点背景。

我一直在阅读这个问题,但它不太符合我的用例

Intercept-sql-statements-containing-parameter-values-generated-by-nhibernate

我遇到的问题是我只想在发生异常(或时间段过去)时注销生成的 SQL。这是为了让我们能够对非常复杂的应用程序中的一些长时间运行的查询进行故障排除。我不想拦截和记录所有查询,因为我相信这会影响性能。

在我想记录它的地方,我有 NHibernate 使用的 ICriteria 对象,所以我要找的是一种“虚拟”NHibernate 对象,我可以触发这些 ICriteria 并取回 SQL字符串(甚至是带有参数占位符和参数列表的 SQL)。

那么是否存在可以做到这一点的东西(我认为它要么非常简单并且我遗漏了一些东西,要么非常困难并且没有其他人需要它)。

如果它不存在,那么在不手动构建 SQL 的情况下创建实现目标的最佳方法是什么(我希望尽可能接近已执行的 SQL)。有没有办法直接进入 NHibernate 生成器并获取字符串?

添加到这里以使其更清楚。

我想在“事后”执行此操作,而不是拦截每个查询(出于性能考虑)。我也不想使用 Log4Net 执行此操作,因为我需要针对 session 记录它。

我在想必须有一种方法来创建第二个 NHibernate 对象,它可能使用不同的驱动程序(一个不进入数据库的驱动程序),这样我就可以实现一种拦截该对象的方法,并且不是持久保存到数据库的主要对象

最佳答案

如果您需要知道在出现异常的情况下执行的查询,您可以使用检查异常上的“Data”附加元素:

yourexception.Data["actual-sql-query"]

包含导致异常的查询。在顺序操作中,您可以使用名为“NHibernate.SQL”的记录器,这是按顺序获取查询文本的最可靠方法,因为其他“直接”方法取决于您查询 NH 的方式(ICriteria、Hql、QueryOver , LinqTONh, SOmeNewWayNotYetImplemented ...) 所以拦截记录器通常更好。

关于c# - 如何在运行时访问(或生成)NHibernate Sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9771087/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com