我有一个 NHibernate 标准,我需要从中获取 SQL 查询。我尝试了各种方法here https://stackoverflow.com/questions/554481/how-to-get-sql-from-hibernate-criteria-api-not-for-logging。但是,我得到的查询中没有参数(它有一个“?”代替,就像上面提到的那样here http://narcanti.keyboardsamurais.de/hibernate-criteria-to-sql-translation.html and )。另外,至少有一件事不起作用是 criteria.setMaxResults(n)。
我也尝试过 NHibernate 拦截器。但是,我在 OnPrepareStatement(sql) 中得到的查询也没有参数。有没有其他方法可以从条件中获取sql查询?
PS:- 首先创建该标准是因为更容易与它们合作来满足复杂的业务需求。但是,我需要导出数据,根据标准,导出速度非常慢。我试图从条件中获取查询,然后从中执行 bcp 导出。
使用记录器,在执行代码之前配置
var sqlLogger = (Logger)LogManager.GetRepository().GetLogger("NHibernate.SQL");
_sqlappender = new NhSqlAppender();
sqlLogger.AddAppender(_sqlappender);
if (!sqlLogger.IsEnabledFor(Level.Debug))
sqlLogger.Level = Level.Debug;
class NhSqlAppender : AppenderSkeleton
{
private List<string> queries = new List<string>(1000);
public IList<string> Queries
{
get { return queries; }
}
protected override void Append(LoggingEvent loggingEvent)
{
queries.Add(loggingEvent.RenderedMessage);
}
}
如何注入非执行连接
class FakeConnectionFactory : DriverConnectionProvider
{
public override IDbConnection GetConnection()
{
return new FakeConnection(base.GetConnection());
}
}
class FakeConnection : DbConnection
{
private IDbConnection _connection;
public FakeConnection(IDbConnection connection)
{
_connection = connection;
}
...
protected override DbCommand CreateDbCommand()
{
return new FakeCommand(_connection.CreateCommand());
}
}
class FakeCommand : DbCommand
{
private IDbCommand iDbCommand;
public FakeCommand(IDbCommand iDbCommand)
{
this.iDbCommand = iDbCommand;
}
...
protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
{
return EmptyDataReader();
}
public override int ExecuteNonQuery()
{
return 0;
}
public override object ExecuteScalar()
{
return 0;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)