Вопрос

Это, вероятно, довольно прост, но я не могу найти разумное объяснение в любой документации.

Я пытаюсь использовать 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() ) Это вернет имя параметра с замененным «@» на «:»; Это должно быть тривиально реализовать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top