2010-12-13 7 views
-1

これはおそらくかなり簡単ですが、どのドキュメントでも合理的な説明が見つからないようです。NHibernate ISQLQuery SetParameterの問題

私はNHibernate.ISQLQueryを使用し、SetResultTransformer()を使用してカスタムSQLクエリからカスタム結果セットを返そうとしています。これと同じように:

public virtual IList<T> GetSQLObject<T>(string sql, IDbParameter[] parameters = null) 
    { 
     ISQLQuery qry = _sess.CreateSQLQuery(sql); 

     qry.SetResultTransformer(Transformers.AliasToBean(typeof(T)));  

     if (parameters != null) { 
      foreach (IDbParameter parameter in parameters) { 
       qry.SetParameter(parameter.Name, parameter.Value); 
      } 
     } 

     return qry.List<T>(); 
    } 

の例を見てから、SQLクエリで私はフォーマットでパラメータを使用する必要がありますようです:パラメータ1の代わりのparam1 @私は、標準のSQLクエリで同じように。クエリで後者の構文を使用すると、qry.SetParameter()でエラーがスローされます。

ISQLQuery/NHibernateがこの形式でそれらを必要とし、通常の構文で動作しない理由はありますか?

答えて

3

SQL Serverは@paramを使用しますが、ほかのデータベースでは使用できません。例えば、MySQLは?paramを使用します。

NHibernateでは、DALの再作成がほとんどまたはまったくない状態で、1つのデータベース実装を別のものに置き換えることができます。これは、NH構成を設定するときに構成したデータベースに基づいてパラメータを設定します。

編集:また、私は思う:PARAMフィルが応答した

+0

よろしくお願いします。 – Brett

0

「なぜ」;:paramは休止状態から生まれましたが、Oracleが使用しているので、それが最初に、開発されたときにOracleをターゲットにしていますおそらく私は "どのように"推薦することができます。 「.GetNHibernateName()のようなタイプのIDbParameterに新しい拡張メソッドを追加するだけではなく、「@」を「:」に置き換えたパラメータ名を返します。実装するのは簡単ではありません。

+0

この拡張メソッドについて詳しく説明できますか?私たちが渡すパラメータ名に接頭文字 ':'または '@'が含まれていないので、内部接頭文字を拡張メソッドでどのように上書きしていますか? –