这可能相当简单,但我似乎无法在任何文档中找到合理的解释。
我正在尝试使用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是否有理由要求这种格式,并且不能使用正常的语法?
答案 0 :(得分:3)
SQL Server使用@param,但不是每个其他数据库都使用。例如,MySQL使用?param
NHibernate允许您将1个数据库实现替换为另一个数据库实现,几乎不需要重新编写DAL。它根据您在设置NH配置时配置的数据库设置参数。
编辑:我也认为:自从Oracle最初开发以来,Hramnate就是针对Oracle的,因为Oracle使用:param
答案 1 :(得分:0)
IDbParameter
类型(类似.GetNHibernateName()
)中添加一个新的扩展方法,它将返回参数名称,并将“@”替换为“:”;这应该是微不足道的。