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

            LeftJoin.Table.DescriptionParserAdapter = LeftJoin.DescriptionParserAdapter;
            cBuffer.Append(LeftJoin.Table.GetParser().Parsing(ref DbParameters));
            cBuffer.Append(" ON");
            ExpDescription ExpDes = (ExpDescription)LeftJoin.OnDescription[0];

            ExpDes.DescriptionParserAdapter = LeftJoin.DescriptionParserAdapter;
            cBuffer.Append(ExpDes.GetParser().Parsing(ref DbParameters));
            if (LeftJoin.OnDescription.Count > 1)
            {
                for (int i = 1; i < LeftJoin.OnDescription.Count; ++i)
                {
                    ExpDes = (ExpDescription)LeftJoin.OnDescription[i];
                    ExpDes.DescriptionParserAdapter = LeftJoin.DescriptionParserAdapter;
                    cBuffer.AppendFormat(" {0} {1}", KeywordsAnd, ExpDes.GetParser().Parsing(ref DbParameters));
                }
            }
            return(cBuffer.ToString());
        }
        /// <summary>
        /// 解释整个表达式信息。
        /// </summary>
        /// <param name="DbParameters">用于缓存在解释过程中可能会产生的参数。</param>
        /// <returns></returns>
        public override string Parsing(ref List <IDbDataParameter> DbParameters)
        {
            ExpDescription expDes    = (ExpDescription)this.Description;
            StringBuilder  cBuffer   = new StringBuilder();
            string         paramName = string.Empty;

            foreach (object item in expDes.ExpElements)
            {   // 如果是命令元素描述对象,则调用它相应的解释器。
                if (item is IDescription)
                {
                    IDescription Des = (IDescription)item;
                    Des.DescriptionParserAdapter = expDes.DescriptionParserAdapter;
                    // 如果是字段描述对象,则先将字段名称记录下来(后面的非描述对象可能需要创建参数,这就需要使用到)
                    FieldDescription fdes = Des as FieldDescription;
                    if (!IsNull(fdes))
                    {
                        paramName = fdes.FieldName;
                    }
                    string buf = Des.GetParser().Parsing(ref DbParameters);
                    // 判断并补空格。
                    if (buf[0] == (char)0x20)
                    {
                        cBuffer.Append(buf);
                    }
                    else
                    {
                        cBuffer.AppendFormat(" {0}", buf);
                    }
                }
                else if (item is char) // 如果是单字符,则先分析是否是预定义的运算符,如果是则需要进行相应的转换。
                {
                    bool   createParam = false;
                    string buf         = ParsingOperChar((char)item, ref createParam);
                    if (createParam && !string.IsNullOrEmpty(paramName))
                    {   // 当单字段并非预定义的运算符时视为值,并为其创建参数。
                        IDbDataParameter p = Adapter.CreateDbParameter(string.Format("u_{0}", paramName), buf);
                        AddDbParameter(ref DbParameters, p);
                        cBuffer.AppendFormat(" {0}", p.ParameterName);
                        paramName = string.Empty; // 参数创建完成后应该清除该记录,否则下一次循环就会一直定沿用。
                    }
                    else
                    {   // 单字符为预定义的运算符时。
                        cBuffer.AppendFormat(" {0}", buf);
                    }
                }
                else // 其他类型的处理
                {
                    if (item.Equals(string.Empty))
                    {   // 空字符串转换。
                        cBuffer.AppendFormat(" ''");
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(paramName))
                        {   // 前面没有检测到字段描述信息,不需要创建参数。
                            cBuffer.AppendFormat(" {0}", item);
                        }
                        else
                        {   // 前面的元素检测到字段信息,需要创建参数。
                            IDbDataParameter p = Adapter.CreateDbParameter(string.Format("u_{0}", paramName), item);
                            AddDbParameter(ref DbParameters, p);
                            cBuffer.AppendFormat(" {0}", p.ParameterName);
                            paramName = string.Empty; // 参数创建完成后应该清除该记录,否则下一次循环就会一直定沿用。
                        }
                    }
                }
            }
            return(cBuffer.ToString());
        }