Слишком много критериев, GenericADOException, не может выполнить запрос - PullRequest
0 голосов
/ 08 марта 2011

У меня есть код, который отлично работает, НО, если я выберу много результатов, он выдаст исключение GenericADOException.

Существует SQL, который генерируется Hibernate:

SELECT  this_.Value as y0_, 
        this_1_.OrderNumber as y1_, 
        count(*) as y2_ 
FROM    DotaznikySpokojenosti.dbo.QuestionRateDTO this_ 
        inner join DotaznikySpokojenosti.dbo.QuestionDTO this_1_ 
        on this_.QuestionRateID=this_1_.ID 
WHERE this_1_.Questinary in (@p0, @p1, @p2, @p3, ... , @p2876) 
GROUP BY this_.Value, this_1_.OrderNumber 
ORDER BY y1_ asc, y0_ asc

Проблема в том, что если в части «IN» в части «WHERE» больше 2000 параметров (не совсем), то это примерно 2000 параметров. Если меньше, то работает отлично.

Это проблема NHibernate или SQL Server?

Что я могу сделать?

Создать более короткие запросы и завершить их в C #?

Теперь у меня есть относительно хороший код, если я сделаю это, я боюсь, что это будет немного грязный код.

Это код, он только для иллюстрации. Я имею в виду, что нет проблем:

public class AdultDAO : ANHibernateDAO<AdultDTO, Nullable<Int32>>, IAdultDAO
    {    
        public ResultQuestinaryDTO Evaluate(
            IEnumerable<LocalityDTO> _Localities,
            IEnumerable<DepartmentDTO> _Departments, 
            bool _IncludeNullDepartment,
            IEnumerable<int> _Months,
            IEnumerable<int> _Years,
            IEnumerable<TypeHospitalization> _Types,
            IEnumerable<Sex> _Sex,
            IEnumerable<int> _Old,
            string _Version)
        {
            // Session
            ISession _Session = NHibernateSessionManager.Instance.GetSession();
            //Criterium
            ICriteria _Criteria = _Session.CreateCriteria(typeof(AdultDTO));

            // Where clause
            _Criteria = _Criteria.Add(Expression.InG("Locality", _Localities.ToArray()));
            _Criteria = _Criteria.Add(Expression.InG("YearHospitalization", _Years.ToArray()));
            _Criteria = _Criteria.Add(Expression.InG("MonthHospitalization", _Months.ToArray()));
            _Criteria = _Criteria.Add(Expression.InG("TypeHospitalization", _Types.ToArray()));
            _Criteria = _Criteria.Add(Expression.InG("Sex", _Sex.ToArray()));
            _Criteria = _Criteria.Add(Expression.InG("Old", _Old.ToArray()));
            _Criteria = _Criteria.Add(Expression.Eq("Version", _Version));

            if ((_Departments.Count() > 0) && (_IncludeNullDepartment))
            {
                _Criteria = _Criteria.Add(Expression.Or(
                    Expression.InG("Department", _Departments.ToArray()),
                    Expression.IsNull("Department")));
            }
            if ((_Departments.Count() > 0))
                _Criteria = _Criteria.Add(Expression.InG("Department", _Departments.ToArray()));
            else
                _Criteria = _Criteria.Add(Expression.IsNull("Department"));

            _Criteria.Add(Expression.Conjunction());
            // Return only id
            _Criteria.SetProjection(Projections.Id());

            // QuestionBoolDTO query
            ICriteria _CriteriaBool = ResultSetHelper.CreateCriteria(
                _Session,
                typeof(QuestionBoolDTO),
                Transformers.AliasToBean<ResultQuestionBoolDTO>(),
                _Criteria.List())
                .AddOrder(new Order("Value", true));

            // QuestionRateDTO query
            ICriteria _CriteriaRate = ResultSetHelper.CreateCriteria(
                _Session,
                typeof(QuestionRateDTO),
                Transformers.AliasToBean<ResultQuestionRateDTO>(),
                _Criteria.List())
                .AddOrder(new Order("Value", true));

            // QuestionSetDTO query
            ICriteria _CriteriaSet = ResultSetHelper.CreateCriteria(
                _Session,
                typeof(QuestionSetDTO),
                Transformers.AliasToBean<ResultQuestionSetDTO>(),
                _Criteria.List());

            // Return result set


            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // THERE IS CRITICAL PART WHICH THROW EXCEPTION:
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

            return new ResultQuestinaryDTO
                (
                    _CriteriaRate.List<ResultQuestionRateDTO>(),
                    _CriteriaSet.List<ResultQuestionSetDTO>(),
                    _CriteriaBool.List<ResultQuestionBoolDTO>(),
                    _Criteria.List().Count,
                    AdultDTO.GetTemplate(_Version)
                );
        }


public class ResultQuestinaryDTO
    {
        private IEnumerable<ResultQuestionBoolDTO> _ResultQuestionBool;        
        private IEnumerable<ResultQuestionSetDTO> _ResultQuestionSet;        
        private IEnumerable<ResultQuestionRateDTO> _ResultQuestionRate;                
        private int _CountQuestinary = 0;

        public ResultQuestinaryDTO(
            IEnumerable<ResultQuestionRateDTO> ResultQuestionRate,
            IEnumerable<ResultQuestionSetDTO> ResultQuestionSet,
            IEnumerable<ResultQuestionBoolDTO> ResultQuestionBool,
            int CountQuestinary,
            QuestinaryTemplateWrapper QuestinaryTemplateWrapper
            )
        {
            _ResultQuestionBool = ResultQuestionBool;
            _ResultQuestionRate = ResultQuestionRate;
            _ResultQuestionSet = ResultQuestionSet;
            this.CountQuestinary = CountQuestinary;
            this.QuestinaryTemplateWrapper = QuestinaryTemplateWrapper;
        }
    }

1 Ответ

1 голос
/ 08 марта 2011

Если вы используете SQL Server, то это ограничивает использование параметров в SQL. Максимальное количество параметров - 2100.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...