/// <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()); }
/// <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()); }