【机房重构】之组合查询

【前言】

都知道组合查询时候,有很多的代码,而且有很多重复的,尤其是爱偷懒的我,当然要找一个捷径呢,减少代码的数量,提高效率。这时候模板方法和存储过程的出现,给我带来很大的好处呢,现在请他们登场吧!吐舌头

【内容】

模板方法,顾名思义就是制作一个模板,然后再按照模板来进行刻画出一个个的子窗体,当然子窗体中在加上自己独有的东西。这样对于类似的窗体来说,就不用单个的、重复进行了,节省了很多的时间和精力呢。首先介绍一下我的组合查询的模板。

首先在模板中写出抽象出来的方法;

       

namespace LoginUI
{
    public partial class modelUI : Form
    {
        public modelUI()
        {
            InitializeComponent();
        }
        //定义虚函数ToName,将查询字段转化为数据库字段  
        #region 虚方法

        //将查询的内容转换成数据库中的列名称
        public virtual string ToName(string combo)
        {
            return "";
        }

        //获得数据库名称
        public virtual string Getdbtable()
        {
            return "";
        }

        #endregion

        LoginEntity.GroupQuery enGroupQuery = new LoginEntity.GroupQuery(); //实例化实体
        public void modelUI_Load(object sender, EventArgs e)
        {
            enGroupQuery.CmboField1 = "";   //不同的窗体字段不同,赋值为“”,子窗体重写
            enGroupQuery.ComboField2 = "";
            enGroupQuery.ComboField3 = "";

            //设定操作符
            cmbOper1.Items.Add(">");
            cmbOper1.Items.Add("<");
            cmbOper1.Items.Add("=");
            cmbOper1.Items.Add("!=");

            cmbOper2.Items.Add(">");
            cmbOper2.Items.Add("<");
            cmbOper2.Items.Add("=");
            cmbOper2.Items.Add("!=");

            cmbOper3.Items.Add(">");
            cmbOper3.Items.Add("<");
            cmbOper3.Items.Add("=");
            cmbOper3.Items.Add("!=");

            cmbGroup1.Items.Add("与");
            cmbGroup1.Items.Add("或");

            cmbGroup2.Items.Add("与");
            cmbGroup2.Items.Add("或");

            //窗体启动后,后两组控件默认不能用
            ComboField2.Enabled = false;   
            cmbOper2.Enabled = false;
            txtContent2.Enabled = false;
            ComboField3.Enabled = false;
            cmbOper3.Enabled = false;
            txtContent3.Enabled = false;

            //时间控件 datetimepicker 不可用
            dtp1.Visible = false;
            dtp2.Visible = false;
            dtp3.Visible = false;
    
        }

       public   void btnSelect_Click(object sender, EventArgs e)
        {
            //每次点击按钮前先清空
            dataGridView1.DataSource = null;
            //判断组合条件,限制组合条件不能为空      
            if (cmbGroup1.Text == "")
            {
                if (CmboField1.Text == "" || cmbOper1.Text == "" || txtContent1.Text == "")
                {
                    MessageBox.Show("第一行的查询条件不能为空!");
                }
            }

            if (cmbGroup2.Text != "")
            {
                if (ComboField2.Text == "" || cmbOper2.Text == "" || txtContent2.Text == "")
                {
                    MessageBox.Show("第二行的查询条件不能为空!");
                }
            }

            if (cmbOper3.Text != "")
            {
                if (ComboField3.Text == "" || cmbOper3.Text == "" || txtContent3.Text == "")
                {
                    MessageBox.Show("第三行的查询条件不能为空!");
                }
            }

            enGroupQuery.CmboField1 = ToName(CmboField1.Text);  //这里调用了重写虚方法的内容
            enGroupQuery.ComboField2 = ToName(ComboField2.Text);
            enGroupQuery.ComboField3 = ToName(ComboField3.Text);           
            enGroupQuery.cmbOper1 = cmbOper1.Text;
            enGroupQuery.cmbOper2 = cmbOper2.Text;
            enGroupQuery.cmbOper3 = cmbOper3.Text;
           
            enGroupQuery.cmbGroup1 = ToName(cmbGroup1.Text);
            enGroupQuery.cmbGroup2 = ToName(cmbGroup2.Text);
           enGroupQuery.txtContent1 = txtContent1.Text.Trim();
            enGroupQuery.txtContent2 = txtContent2.Text.Trim();
            enGroupQuery.txtContent3 = txtContent3.Text.Trim();

            enGroupQuery.Getdbtable = Getdbtable();  //获取数据库名称中的表格
            Facade.GroupQueryFacade facade = new Facade.GroupQueryFacade();
            DataTable dt = facade.groupQuery(enGroupQuery);
            if (dt.Rows.Count <=0)
            {
                MessageBox.Show("没有符合条件的查询!");
                dataGridView1.DataSource = null;   //将表格数据清空                
            }
            else
            {
                dataGridView1.DataSource = dt;  //将查询的数据显示到表格中
            }       
       }

        public void cmbGroup1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbGroup1.Text=="")   //第一个查询条件为空
            {
                ComboField2.Enabled = false;   //第二行的查询条件不可以使用
                cmbOper2.Enabled = false;
                txtContent2.Enabled = false;

                ComboField3.Enabled = false;   //第三行的查询条件不可以使用
                cmbOper3.Enabled = false;
                txtContent3.Enabled = false;
            }

            else
            {
                ComboField2.Enabled = true;   //第二行的查询条件可以使用
                cmbOper2.Enabled = true;
                txtContent2.Enabled = true;
            }
            
        }

        public void cmbGroup2_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbGroup2.Text=="")
            {
                ComboField3.Enabled = false;   //第三行的查询条件不可以使用
                cmbOper3.Enabled = false;
                txtContent3.Enabled = false;
            }
            else
            {
                ComboField3.Enabled = true;   //第三行的查询条件可以使用
                cmbOper3.Enabled = true;
                txtContent3.Enabled = true;
            }
            
        
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

然后在进行在创建子窗体,将子窗体中的一些具体的东西实现出来,进行父类中一些虚方法的重写。在这里用‘学生基本信息’来举例说明一下!

  public override string ToName(string combo)   //重写转换成数据库认识到字符串
        {
            //return base.ToName(combo);
            switch (combo)
            {
            
                case"卡号":
                    return"cardNo";
                case"学号":
                    return "studentNo";
                case"姓名":
                    return "studentName";
                case"性别":
                    return "sex";
                case"系别":
                    return "department";
                case"年级":
                    return "grade";
                case"班级":
                    return "class";
                case "或":
                    return "or";
                case"与":
                    return "and";
                default:
                    return "";
            }
        }

        public override string Getdbtable()  //重写查询表的名称,这里查询的是视图 --学生卡
        {
            return "V_CardStudent";
        }

        public void StuInfoUI_Load(object sender, EventArgs e)
        {
            //设定操作符
            cmbOper1.Items.Add(">");
            cmbOper1.Items.Add("<");
            cmbOper1.Items.Add("=");
            cmbOper1.Items.Add("!=");

            cmbOper2.Items.Add(">");
            cmbOper2.Items.Add("<");
            cmbOper2.Items.Add("=");
            cmbOper2.Items.Add("!=");

            cmbOper3.Items.Add(">");
            cmbOper3.Items.Add("<");
            cmbOper3.Items.Add("=");
            cmbOper3.Items.Add("!=");

            cmbGroup1.Items.Add("与");
            cmbGroup1.Items.Add("或");

            cmbGroup2.Items.Add("与");
            cmbGroup2.Items.Add("或");
            
            
            CmboField1.Items.Add("卡号");
            CmboField1.Items.Add("学号");
            CmboField1.Items.Add("姓名");
            CmboField1.Items.Add("性别");
            CmboField1.Items.Add("系别");
            CmboField1.Items.Add("年级");
            CmboField1.Items.Add("班级");

            ComboField2.Items.Add("卡号");
            ComboField2.Items.Add("学号");
            ComboField2.Items.Add("姓名");
            ComboField2.Items.Add("性别");
            ComboField2.Items.Add("系别");
            ComboField2.Items.Add("班级");
            ComboField2.Items.Add("年级");


            ComboField3.Items.Add("卡号");
            ComboField3.Items.Add("学号");
            ComboField3.Items.Add("姓名");
            ComboField3.Items.Add("性别");
            ComboField3.Items.Add("系别");
            ComboField3.Items.Add("班级");
            ComboField3.Items.Add("年级");
        }

在这里,因为涉及到多个数据库表的操作,运用存储过程给我省了很多的麻烦呢,当然也不是说存储过程是神圣的呢,只有用对了地方,它才能给我们带来事半功倍的效果呢!温馨提示一下呢,数据库里面的sql查询语句要求的特别严格,在这上面的辛酸史我就不说了,不过也让我学到了很多呢! 大笑

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<十三期 王婷婷>
-- Create date: <2017/6/10>
-- Description:	<组合查询模板>
-- =============================================

ALTER PROCEDURE [dbo].[PROC_GroupQuery]
	-- Add the parameters for the stored procedure here
	@CmboField1 varchar(40),
	@ComboField2 varchar(40),
	@ComboField3 varchar(40),

	@cmbOper1 varchar(40),
	@cmbOper2 varchar(40),
	@cmbOper3 varchar(40),

	@txtContent1 varchar(40),
	@txtContent2 varchar(40),
	@txtContent3 varchar(40),

	@cmbGroup1 varchar(40),
	@cmbGroup2 varchar(40),

	@Getdbtable nvarchar(255)
as
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
   declare @Sql varchar(500)
   set @Sql='select * from '+ @Getdbtable +' where '+ @CmboField1+ @cmbOper1+char(39)+ @txtContent1+char(39)
   if (@cmbGroup1 !='')
  

      set @Sql=@Sql +@cmbGroup1 +char(32)+@ComboField2 +@cmbOper2 +char(39)+ @txtContent2 +char(39)
	  -- select * from V_CardStudent  where cardNo= '4'or studentNo='3'

   if (@cmbGroup2 !='')
   set @Sql=@Sql+ @cmbGroup2+char(32)+ @ComboField3 + @cmbOper3 +char(39)+ @txtContent3 +char(39)
   exec(@Sql)
END

【总结】

都说组合查询是机房重构的一个难点,我们当然不能没有进行战斗就自动退出了。迎刃而上,发现其实也没有想象的那么难呢!一个项目终于要看到结尾了,中间也有很多心酸史呢,但是想想自己的成果马上出炉了,心中还是会有小小的成就感呢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 40
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值