Nhibernate Isqlquery SetParameter выпуск
-
09-10-2019 - |
Вопрос
Это, вероятно, довольно прост, но я не могу найти разумное объяснение в любой документации.
Я пытаюсь использовать Nibernate.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 ().
Есть ли причина, почему iSlquery / Nibernate требует их в этом формате и не будет работать с обычным синтаксисом?
Решение
SQL Server использует @param, но не каждая другая база данных. Например, MySQL использует? PARAL
NHIBERNATE позволяет вам поменять 1 реализацию базы данных для другого, чтобы не было переоборудованием вашего DAL. Он устанавливает параметры на основе базы данных, которую вы настроили при настройке конфигурации NH.
Редактировать: Также я думаю: Param пришел от Hibernate, предназначенного для Oracle, когда он был изначально разработан, поскольку Oracle использует: Paral
Другие советы
Фил ответил на «почему»; Так что, возможно, я могу порекомендовать «Как»; Почему бы не просто добавить новый метод расширения в IDbParameter
Тип (что-то вроде .GetNHibernateName()
) Это вернет имя параметра с замененным «@» на «:»; Это должно быть тривиально реализовать.