/// <summary>
        /// Constructor
        /// </summary>
        /// <param name="dmParent"></param>
        /// <param name="tableName"></param>
        /// <param name="defaultOrder"></param>
        /// <param name="groupByClause"></param>
        /// <param name="selectClause"></param>
        public SearchManagerGroupByDetail(IDisplayManager dmParent, string tableName, string defaultOrder, string selectClause, string groupByClause)
            : base(dmParent)
        {
            m_parentSm = dmParent.SearchManager as SearchManager;
            if (m_parentSm == null)
            {
                SearchManagerGroupByDetail se = dmParent.SearchManager as SearchManagerGroupByDetail;
                if (se == null)
                {
                    throw new ArgumentException("SearchManagerGroupByDetail's Parent SearchManager must be Feng.Data.SearchManager or SearchManagerGroupByDetail!", "se");
                }
                m_parentSm = se.m_innerSearchManager;
            }
            if (string.IsNullOrEmpty(m_parentSm.GroupBySql))
            {
                throw new ArgumentException("SearchManagerGroupByDetail's Parent SearchManager must has groupby sub clause!", "GroupBySql");
            }
            string s = m_parentSm.GroupBySql.ToUpper().Replace("GROUP BY", "");
            m_groupByColumns = s.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < m_groupByColumns.Length; ++i)
            {
                m_groupByColumns[i] = m_groupByColumns[i].Trim();
            }
            m_innerSearchManager = new SearchManager(tableName, defaultOrder, selectClause, groupByClause);
            m_innerSearchManager.Name = this.Name + ".Inner";

            m_tableName = tableName;
            m_defaultOrder = defaultOrder;
            m_selectClause = selectClause;
            m_groupByClause = groupByClause;

            m_innerSearchManager.EnablePage = false;
        }
Example #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="searchExpression"></param>
        /// <returns></returns>
        public virtual DbCommand CreateCountDbCommand(ISearchExpression searchExpression)
        {
            DbCommand cmd = DbHelper.Instance.Database.DbProviderFactory.CreateCommand();

            cmd.CommandType = System.Data.CommandType.Text;

            if (searchExpression is QueryExpression)
            {
                string str = (searchExpression as QueryExpression).Query;
                str = str.ToUpper();
                int idx  = str.IndexOf("' '");
                int idx2 = str.IndexOf("FROM");
                str             = str.Replace(str.Substring(idx, idx2 - idx), " COUNT(*) ");
                cmd.CommandText = str;
            }
            else
            {
                int paramCnt = 0;
                // Add Where
                if (searchExpression != null)
                {
                    string s = SearchManager.FillDbCommand(searchExpression, cmd.Parameters, false, ref paramCnt, m_selectAsColumns);
                    if (!string.IsNullOrEmpty(s))
                    {
                        cmd.CommandText += " WHERE " + s;
                    }
                }

                string groupBy = SearchManager.GetGroupCommand(m_groupBySql);
                if (!string.IsNullOrEmpty(groupBy))
                {
                    cmd.CommandText += groupBy;

                    // Add Having
                    if (searchExpression != null)
                    {
                        string s = SearchManager.FillDbCommand(searchExpression, cmd.Parameters, true, ref paramCnt, m_selectAsColumns);
                        if (!string.IsNullOrEmpty(s))
                        {
                            cmd.CommandText += " HAVING " + s;
                        }
                    }
                }

                if (paramCnt > 2100)
                {
                    throw new NotSupportedException("您输入的参数过多,系统最多只支持2100个参数!");
                }
            }

            return(cmd);
        }
        //private void ProcessCmd(DbCommand cmd)
        //{
        //    foreach (string s in m_funcParams)
        //    {
        //        if (!cmd.Parameters.Contains(s))
        //        {
        //            cmd.CommandText = cmd.CommandText.Replace(s, "default");
        //        }
        //        else
        //        {
        //            // remove like %
        //            string likeString = cmd.Parameters[s].Value as string;
        //            if (!string.IsNullOrEmpty(likeString))
        //            {
        //                if (likeString[0] == '%' && likeString[likeString.Length - 1] == '%')
        //                {
        //                    cmd.Parameters[s].Value = likeString.Substring(1, likeString.Length - 2);
        //                }
        //            }

        //            // remove where clause
        //            int idx = cmd.CommandText.IndexOf("WHERE");
        //            idx = cmd.CommandText.IndexOf(s, idx);

        //            int idx2 = idx;

        //            // jump to "=, >="
        //            idx2--;
        //            while (cmd.CommandText[idx2] == ' ')
        //                idx2--;

        //            // jump to space
        //            idx2--;
        //            while (cmd.CommandText[idx2] != ' ')
        //                idx2--;

        //            // jump to propertyName
        //            idx2--;
        //            while (cmd.CommandText[idx2] == ' ')
        //                idx2--;

        //            // jump to space
        //            idx2--;
        //            while (cmd.CommandText[idx2] != ' ')
        //                idx2--;

        //            cmd.CommandText = cmd.CommandText.Replace(cmd.CommandText.Substring(idx2 + 1, idx - idx2 - 1 + s.Length), "1 = 1");
        //        }
        //    }
        //}

        private ISearchExpression RemoveFunctionParamSearchExpression(ISearchExpression se, Dictionary <string, object> deletedParam)
        {
            if (se == null)
            {
                return(null);
            }
            if (se is LogicalExpression)
            {
                LogicalExpression le = se as LogicalExpression;
                ISearchExpression ls = RemoveFunctionParamSearchExpression(le.LeftHandSide, deletedParam);
                ISearchExpression rs = RemoveFunctionParamSearchExpression(le.RightHandSide, deletedParam);
                switch (le.LogicOperator)
                {
                case LogicalOperator.And:
                    return(SearchExpression.And(ls, rs));

                case LogicalOperator.Or:
                    return(SearchExpression.Or(ls, rs));

                case LogicalOperator.Not:
                    return(SearchExpression.Not(ls));

                default:
                    throw new NotSupportedException("Not Supported LogicalOperator!");
                }
            }
            else if (se is SimpleExpression)
            {
                SimpleExpression cse = se as SimpleExpression;

                string paramName = SearchManager.CreateParamName(cse, null);
                if (Array.IndexOf(m_funcParams, paramName) != -1)
                {
                    deletedParam[paramName] = cse.Values;
                    return(null);
                }
                else
                {
                    return(cse);
                }
            }
            else
            {
                return(se);
            }
        }
Example #4
0
        private void ParseQueryString(string queryString)
        {
            m_queryString = queryString.ToUpper();

            int idx = m_queryString.IndexOf("GROUP BY");

            if (idx != -1)
            {
                m_selectSql  = m_queryString.Substring(0, idx);
                m_groupBySql = m_queryString.Substring(idx);

                int    idx2      = m_selectSql.IndexOf("FROM");
                string selectSql = m_selectSql.Substring(0, idx2);
                m_selectAsColumns = SearchManager.ParseSelectCommand(selectSql);
            }
            else
            {
                m_selectSql       = m_queryString;
                m_groupBySql      = null;
                m_selectAsColumns = new Dictionary <string, string>();
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="src"></param>
        /// <param name="dest"></param>
        protected void Copy(SearchManager src, SearchManager dest)
        {
            dest.m_dataCanPage = src.m_dataCanPage;
            dest.m_selectAsColumns = src.m_selectAsColumns;

            base.Copy(src, dest);
        }
 /// <summary>
 /// ����
 /// </summary>
 /// <returns></returns>
 public override object Clone()
 {
     SearchManager sm = new SearchManager(this.m_tableName, m_defaultOrder, m_selectSql, m_groupBySql, this.EnablePage);
     Copy(this, sm);
     return sm;
 }