/// <summary>
        /// 解释 ORDER BY 子句。
        /// </summary>
        /// <param name="DbParameters">用于缓存在解释过程中可能会产生的参数。</param>
        /// <returns></returns>
        public override string Parsing(ref List <IDbDataParameter> DbParameters)
        {
            OrderByBlock  orderBy = (OrderByBlock)this.Description;
            StringBuilder cBuffer = new StringBuilder(" ORDER BY");

            orderBy.Field.DescriptionParserAdapter = orderBy.DescriptionParserAdapter;
            cBuffer.AppendFormat(" {0}", orderBy.Field.GetParser().Parsing(ref DbParameters));
            switch (orderBy.Sort)
            {
            case OrderByMode.ASC:
                cBuffer.AppendFormat(" ASC");
                break;

            default:
                cBuffer.AppendFormat(" DESC");
                break;
            }
            return(cBuffer.ToString());
        }
Esempio n. 2
0
        /// <summary>
        /// 分布关键的命令部份解释。
        /// </summary>
        /// <param name="sBlock">SELECT命令段描述对象。</param>
        /// <param name="DbParameters">用于缓存在解释过程中可能会产生的参数。</param>
        /// <returns></returns>
        private string ParsingCore(SelectBlock sBlock, ref List <IDbDataParameter> DbParameters)
        {
            bool AppendComma = true; // 用于标识每个段后是否添加逗号。

            sBlock.Blocks[0].DescriptionParserAdapter = sBlock.DescriptionParserAdapter;
            string item_buf = sBlock.Blocks[0].GetParser().Parsing(ref DbParameters);

            if (item_buf[0] == (char)0x20)
            {
                item_buf = item_buf.Remove(0, 1);
            }
            StringBuilder FieldsBuffer = new StringBuilder(item_buf); // 查询的字段信息部份
            StringBuilder OtherBuffer  = new StringBuilder();         // 除字段信息之外的其它子句部份
            OrderByBlock  OverOrderBy  = null;

            for (int i = 1; i < sBlock.Blocks.Count; ++i)
            {
                if (sBlock.Blocks[i] is FromBlock || sBlock.Blocks[i] is WhereBlock || sBlock.Blocks[i] is GroupByBlock)
                {
                    AppendComma = false;
                }
                if (sBlock.Blocks[i] is OrderByBlock)
                {
                    AppendComma = false;
                    OverOrderBy = (OrderByBlock)sBlock.Blocks[i];
                    continue; // 不在内嵌SELECT子句中生成 ORDER BY 子句(否则会产生查询错误)
                }
                sBlock.Blocks[i].DescriptionParserAdapter = sBlock.DescriptionParserAdapter;
                item_buf = sBlock.Blocks[i].GetParser().Parsing(ref DbParameters);
                if (AppendComma)
                {
                    if (item_buf[0] == (char)0x20)
                    {
                        FieldsBuffer.AppendFormat(",{0}", item_buf);
                    }
                    else
                    {
                        FieldsBuffer.AppendFormat(", {0}", item_buf);
                    }
                }
                else
                {
                    if (item_buf[0] == (char)0x20)
                    {
                        OtherBuffer.Append(item_buf);
                    }
                    else
                    {
                        OtherBuffer.AppendFormat(" {0}", item_buf);
                    }
                }
            }
            if (OverOrderBy == null)
            {
                if (IsNull(sBlock.Pager.HelpField))
                {
                    throw (new Exception("解释分页时失败:没有提供排序字段。"));
                }
                OverOrderBy       = new OrderByBlock();
                OverOrderBy.Field = sBlock.Pager.HelpField;
                OverOrderBy.Sort  = sBlock.Pager.HelpSort;
            }
            StringBuilder SqlCore = new StringBuilder("WITH [PAGE_TEMP] AS (SELECT ");

            OverOrderBy.DescriptionParserAdapter = sBlock.DescriptionParserAdapter;
            SqlCore.AppendFormat("{0}, ROW_NUMBER() OVER({1}) AS [ROWNUM]", FieldsBuffer, OverOrderBy.GetParser().Parsing(ref DbParameters));
            SqlCore.Append(OtherBuffer);
            SqlCore.AppendFormat(") ");
            return(SqlCore.ToString());
        }