nhibernate isqlquery setParameterの問題
-
09-10-2019 - |
質問
これはおそらくかなり簡単ですが、ドキュメントで合理的な説明を見つけることができないようです。
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クエリでは形式でパラメーターを使用する必要があるようです。 :param1 それ以外の @param1 標準のSQLクエリのように。クエリで後者の構文を使用すると、qry.setparameter()でエラーがスローされます。
iSQlquery/nhibernateがこの形式でそれらを必要とし、通常の構文で動作しない理由はありますか?
解決
SQL Serverは@Paramを使用しますが、他のすべてのデータベースが使用するわけではありません。たとえば、mysqlは?paramを使用します
Nhibernateを使用すると、DALをほとんどまたはまったく再加工して、1つのデータベース実装を別のデータベース実装に交換できます。 NH構成をセットアップするときに構成したデータベースに基づいてパラメーターを設定します。
編集:また私は思う:パラメートは、Oracleが使用しているため、最初に開発されたときにHibernateがOracleを標的にされることから生まれました:Param
他のヒント
フィルは「なぜ」に答えました。だから、おそらく私は「方法」を勧めることができます。新しい拡張法を追加してみませんか IDbParameter
タイプ(ようなもの .GetNHibernateName()
)パラメーター名は「@」が「 ":"に置き換えられて返されます。それは実装するのに些細なことです。