Ejemplo n.º 1
0
        /// <summary>
        /// 产生解析后的SQL
        /// </summary>
        /// <param name="DBEx">数据库前缀</param>
        /// <param name="SelectType">查询类型:普通的查询所有列,总数,某个字段汇总,某个字段最大值,某个字段最小值</param>
        /// <param name="ColumnName">字段名</param>
        /// <returns></returns>
        protected string GetSQL(string DBEx, string SelectType, string ColumnName, out Parameter[] Parameters)
        {
            List <Parameter> lstParameters = new List <Parameter>();
            StringBuilder    sbSQL         = new StringBuilder();

            DataRow[] drGroupBy = _dt_Condition.Copy().Select("Condition='groupby'");
            sbSQL.Append(" SELECT ");
            //判断查询的类型,然后决定查询哪些字段
            switch (SelectType)
            {
            case "getcount":    //总数
                sbSQL.Append(" COUNT(*) ");
                break;

            case "getsum":    //汇总
                sbSQL.Append(" SUM([" + ColumnName + "]) ");
                break;

            case "getmax":    //最大值
                sbSQL.Append(" MAX([" + ColumnName + "]) ");
                break;

            case "getmin":    //最小值
                sbSQL.Append(" MIN([" + ColumnName + "]) ");
                break;

            default:    //获得model
                #region TOP
                DataRow[] drTop = _dt_Condition.Copy().Select("Condition='top'");
                if (drTop != null && drTop.Length > 0)
                {
                    sbSQL.Append(" TOP " + drTop[0]["Value"].ToString() + " ");
                }
                #endregion
                #region Group By -- 查询group by的字段
                if (drGroupBy != null && drGroupBy.Length > 0)
                {
                    for (int i = 0; i < drGroupBy.Length; i++)
                    {
                        if (drGroupBy[i]["Value"].ToString().Split(new char[] { ',' }).Length > 1)
                        {
                            if (i == 0)
                            {
                                sbSQL.Append(drGroupBy[i]["Value"].ToString());
                            }
                            else
                            {
                                sbSQL.Append("," + drGroupBy[i]["Value"].ToString());
                            }
                        }
                        else
                        {
                            if (i == 0)
                            {
                                sbSQL.Append("[" + drGroupBy[i]["Value"].ToString() + "]");
                            }
                            else
                            {
                                sbSQL.Append(",[" + drGroupBy[i]["Value"].ToString() + "]");
                            }
                        }
                    }
                }
                #endregion
                #region 非group by
                else
                {
                    #region Distinct
                    DataRow[] drDistinct = _dt_Condition.Copy().Select("Condition='distinct'");
                    if (drDistinct != null && drDistinct.Length > 0)
                    {
                        sbSQL.Append(" DISTINCT ");
                        for (int i = 0; i < drDistinct.Length; i++)
                        {
                            if (i == 0)
                            {
                                sbSQL.Append("[" + drDistinct[i]["Value"].ToString() + "]");
                            }
                            else
                            {
                                sbSQL.Append(",[" + drDistinct[i]["Value"].ToString() + "]");
                            }
                        }
                    }
                    #endregion
                    #region 没有任何字段查询限制条件,查询所有字段
                    else
                    {
                        for (int i = 0; i < _dt_ClassDef.Columns.Count; i++)
                        {
                            if (i == 0)
                            {
                                sbSQL.Append("[" + _dt_ClassDef.Columns[i].ColumnName + "]");
                            }
                            else
                            {
                                sbSQL.Append(",[" + _dt_ClassDef.Columns[i].ColumnName + "]");
                            }
                        }
                    }
                    #endregion
                }
                #endregion
                break;
            }
            sbSQL.Append(" FROM ");
            sbSQL.Append(_cad_TableDef.GetFullTableName(DBEx));
            #region Where
            DataRow[] drWhere = _dt_Condition.Copy().Select("Condition='where'");
            if (drWhere != null && drWhere.Length > 0)
            {
                sbSQL.Append(" WHERE ");
                for (int i = 0; i < drWhere.Length; i++)
                {
                    Parameter[] objParameters = drWhere[i]["Parameters"] as Parameter[];
                    foreach (Parameter Parameter in objParameters)
                    {
                        lstParameters.Add(Parameter);
                    }
                    if (i == 0)
                    {
                        sbSQL.Append(" (" + drWhere[i]["Value"].ToString() + ") ");
                    }
                    else
                    {
                        sbSQL.Append(" OR (" + drWhere[i]["Value"].ToString() + ") ");
                    }
                }
            }
            #endregion
            #region Group By -- 分组条件
            if (drGroupBy != null && drGroupBy.Length > 0)
            {
                sbSQL.Append(" GROUP BY ");
                for (int i = 0; i < drGroupBy.Length; i++)
                {
                    if (drGroupBy[i]["Value"].ToString().Split(new char[] { ',' }).Length > 1)
                    {
                        if (i == 0)
                        {
                            sbSQL.Append(drGroupBy[i]["Value"].ToString());
                        }
                        else
                        {
                            sbSQL.Append("," + drGroupBy[i]["Value"].ToString());
                        }
                    }
                    else
                    {
                        if (i == 0)
                        {
                            sbSQL.Append("[" + drGroupBy[i]["Value"].ToString() + "]");
                        }
                        else
                        {
                            sbSQL.Append(",[" + drGroupBy[i]["Value"].ToString() + "]");
                        }
                    }
                }
            }
            #region Having -- 分组后条件
            DataRow[] drHaving = _dt_Condition.Copy().Select("Condition='having'");
            if (drHaving != null && drHaving.Length > 0)
            {
                sbSQL.Append(" HAVING ");
                for (int i = 0; i < drHaving.Length; i++)
                {
                    Parameter[] objParameters = drHaving[i]["Parameters"] as Parameter[];
                    foreach (Parameter Parameter in objParameters)
                    {
                        lstParameters.Add(Parameter);
                    }
                    if (i == 0)
                    {
                        sbSQL.Append(" (" + drHaving[i]["Value"].ToString() + ") ");
                    }
                    else
                    {
                        sbSQL.Append(" OR (" + drHaving[i]["Value"].ToString() + ") ");
                    }
                }
            }
            #endregion
            #endregion
            #region Order By
            DataRow[] drOrderBy = _dt_Condition.Copy().Select("Condition='orderby'");
            if (drOrderBy != null && drOrderBy.Length > 0)
            {
                sbSQL.Append(" ORDER BY ");
                for (int i = 0; i < drOrderBy.Length; i++)
                {
                    if (i == 0)
                    {
                        sbSQL.Append(drOrderBy[i]["Value"].ToString());
                    }
                    else
                    {
                        sbSQL.Append("," + drOrderBy[i]["Value"].ToString());
                    }
                }
            }
            #endregion
            Parameters = lstParameters.ToArray();
            return(sbSQL.ToString());
        }