-1

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

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 クエリでは、標準の SQL クエリの場合と同様に、 @param1の代わりに:param1の形式でパラメーターを使用する必要があるようです。クエリで後者の構文を使用すると、qry.SetParameter() でエラーがスローされます。

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

4

2 に答える 2

3

SQL Server は @param を使用しますが、他のすべてのデータベースが使用するわけではありません。たとえば、MySQL は ?param を使用します。

NHibernate を使用すると、DAL をほとんどまたはまったく変更せずに、1 つのデータベース実装を別のデータベース実装に交換できます。NH 構成のセットアップ時に構成したデータベースに基づいてパラメーターを設定します。

編集: また、:param は、Oracle が :param を使用するため、最初に開発されたときに Hibernate が Oracle を対象としていたことから生まれたと思います。

于 2010-12-13T07:03:12.463 に答える
0

フィルは「理由」に答えました。したがって、おそらく「方法」をお勧めできます。「@」を「:」に置き換えたパラメーター名を返す新しい拡張メソッドをIDbParameter型 (のようなもの) に追加しないのはなぜですか。.GetNHibernateName()実装するのは簡単です。

于 2010-12-13T20:26:44.960 に答える