如何在NHibernate 5中捕获查询执行?

时间:2019-01-09 11:35:44

标签: nhibernate

我希望能够对SqlCommand.ExecuteReader之类进行try / catch,这样我就可以捕获ADO异常并使用比引发异常时所包含的更好的信息记录问题查询由NH。我尝试过各种方式到达那里,例如覆盖SqlClientDriver以返回自己的SqlCommand版本,但是在接口使用NH5更改为使用DbCommand而非{ {1}}(因此我不能使用代理服务器)和IDbCommand本身是密封的(因此我不能使用子类)这一事实使我受阻。

要明确:我不想简单地翻译异常。无论何时何地,我都希望获得有关原始查询的所有信息。

谢谢。

1 个答案:

答案 0 :(得分:1)

NHibernate引发的异常包括查询本身。我不确定“所有信息”是什么意思。

其他选择是使用Log4Net记录生成的SQL:

Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders();

FileAppender fileAppender = new FileAppender();
fileAppender.Name = "NHFileAppender";
fileAppender.File = config.LogFilePath;
fileAppender.AppendToFile = true;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.Layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss}:%m%n%n");
fileAppender.ActivateOptions();

Logger logger = hierarchy.GetLogger("NHibernate.SQL") as Logger;
logger.Additivity = false;
logger.Level = Level.Debug;
logger.AddAppender(fileAppender);

hierarchy.Configured = true;

这将记录成功和失败的语句。您可以同时使用PatternLayoutGetLogger来获取有关查询的其他信息。