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()) который будет возвращать имя параметра с "@", замененным на ":"; это должно быть тривиально для реализации.

Другие вопросы по тегам