2012-03-14 7 views
2

私はSQLクエリを取得する必要があるNHibernate基準を持っています。私はhereから様々な方法を試みました。しかし、私が得たクエリにはパラメータがありません(代わりにherehereのように '?'があります)。また、動作しない少なくとも1つのものは、criteria.setMaxResults(n)です。条件が実行される前にNHibernate基準からSQLクエリを取得します

私もNHibernateインターセプタを試しました。しかし、私がOnPrepareStatement(sql)で取得したクエリにもパラメータはありません。条件からSQLクエリを取得する他の方法はありますか?

PS: - この基準は、複雑なビジネスニーズに対応しやすいため、最初に作成されます。しかし、私はデータのエクスポートを行う必要がありますが、それは基準によって非常に遅いです。私は、基準からクエリを取得しようとしているし、bcpのエクスポートを行う。

答えて

0

を注入するコード

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); 
    } 
} 

HOWTOを実行する前に構成されたロガーを使用して、私は完全なクエリを取得するのは不可能だと思いますパラメータがすべての場所に追加されるので、すべてのパラメータ。また、いくつかの手法でも問題があります。たとえば、join walker、setMaxResultsが機能しない場合など、nhibernateの変更が破られることがあります。

1

質問を自分自身に答えるために非実行接続

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; 
    } 
} 
+0

これはログから来て以来、実行後のクエリを私に与えませんか?基準が発動するクエリが必要なので、他の方法で使用することができます。 –

+1

これはあまり簡単ではありません。パラメータがすべての場所に追加されているからです。 – Firo

+0

同じリンク/参照を実行しない偽の接続とコマンドを実装できますか? –

関連する問題