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 мне нужно использовать параметры в формате :param1 вместо @param1, как в стандартном запросе SQL. Если я использую последний синтаксис в запросе, он выдает ошибку в qry.SetParameter().
Есть ли причина, по которой ISQLQuery/NHibernate требует их в этом формате и не будет работать с обычным синтаксисом?
2 ответа
SQL Server использует @param, но не все остальные базы данных. Например, MySQL использует? Param
NHibernate позволяет вам заменить одну реализацию базы данных на другую с минимальной переработкой вашего DAL. Он устанавливает параметры на основе базы данных, которую вы настроили при настройке конфигурации NH.
Редактировать: Также я думаю:param появился из-за того, что Hibernate был нацелен на Oracle, когда он был изначально разработан, так как Oracle использует:param
Фил ответил "почему"; так что, возможно, я могу порекомендовать "как"; почему бы просто не добавить новый метод расширения к IDbParameter
тип (что-то вроде .GetNHibernateName()
) который будет возвращать имя параметра с "@", замененным на ":"; это должно быть тривиально для реализации.