代码改变世界

asp.net 应用开发(SQL查询条件拼合)思路

2012-07-04 17:36  秋日愚夫  阅读(854)  评论(3编辑  收藏  举报

场景:表单中有多个查询项,用户可以随机选择其中若干个,查询条件。

问题:怎样将用户所选的查询项,拼接成SQL语句。

思路:1,写一个SWITCH用非空域,匹配查询项语句。并与用户输入值拼合成基本查询子项单元。

         2,将上一步结果存入LIST<string>。

         3,遍历list,基本查询子项单元之间 用"and"连接,生成最终的查询条件。

代码:明天上。。。。现在要下班喽。。。

 

    //根据表单生成查询条件既where子句,用于传递给ORM
        private string GetQuery()
        {
            string Result = string.Empty;
            Dictionary<string, string> QueryItems = new Dictionary<string, string>();

            QueryItems = GetParaAndCreateQueryItems(); //从表单中的控件获取值,并且把非空项生成查询子项集(键值对)。
            Result = SetResultByQueryItems(QueryItems);//根据查询子项集,拼合成Where子句

            if (string.IsNullOrEmpty(Result))
            {
                Result = " 1=1 ";
            }

            return Result;
        }

        private string SetResultByQueryItems(Dictionary<string, string> QueryItems)
        {
            string Result = string.Empty;
            List<string> Where =new List<string>();

            foreach (var s in QueryItems)
            {
                string Temp = string.Empty;
                switch (s.Key)
                {
                    case "tagstring":
                        Temp = string.Format(" tagstring = '{0}' ", s.Value);
                        break;
                    case "starttime":
                        Temp = string.Format(" OperateTime > '{0}' ", s.Value);
                        break;
                    case "endtime":
                        Temp = string.Format(" OperateTime < '{0}' ", s.Value);
                        break;
                    case "operatetype":
                        if (s.Value != "IO")
                        {
                            Temp = string.Format(" operatetype = '{0}' ", s.Value);
                        }
                        break;
                }

                Where.Add(Temp);
            }

            foreach (string s in Where)
            {
                if (string.IsNullOrEmpty(s))
                { continue; }

                Result += string.Format("{0} and", s);
            }

            Result = Result.TrimEnd().TrimEnd('d').TrimEnd('n').TrimEnd('a');

            return Result;
        }

        private Dictionary<string, string> GetParaAndCreateQueryItems()
        {
            Dictionary<string, string> Result = new Dictionary<string, string>();
            string TagString = this.txtTagstring.Text;
            string StartTime = this.txtStartTime.Text;
            string EndTime = this.txtEndTime.Text;
            string OperateType = this.ddlOperateType.SelectedValue;

            if (!string.IsNullOrEmpty(TagString))
            {
                Result.Add("tagstring", TagString);
            }

            if (!string.IsNullOrEmpty(StartTime))
            {
                Result.Add("starttime", DateTime.Parse(StartTime).ToString());
            }

            if (!string.IsNullOrEmpty(EndTime))
            {
                Result.Add("endtime", DateTime.Parse(EndTime).AddDays(1).AddSeconds(-1).ToString());
            }

            if (!string.IsNullOrEmpty(OperateType))
            {
                Result.Add("operatetype", OperateType);
            }

            return Result;
        }

 

最终页面,就是这样了。。。