【前言】
都知道组合查询时候,有很多的代码,而且有很多重复的,尤其是爱偷懒的我,当然要找一个捷径呢,减少代码的数量,提高效率。这时候模板方法和存储过程的出现,给我带来很大的好处呢,现在请他们登场吧!
【内容】
模板方法,顾名思义就是制作一个模板,然后再按照模板来进行刻画出一个个的子窗体,当然子窗体中在加上自己独有的东西。这样对于类似的窗体来说,就不用单个的、重复进行了,节省了很多的时间和精力呢。首先介绍一下我的组合查询的模板。
首先在模板中写出抽象出来的方法;
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
【总结】
都说组合查询是机房重构的一个难点,我们当然不能没有进行战斗就自动退出了。迎刃而上,发现其实也没有想象的那么难呢!一个项目终于要看到结尾了,中间也有很多心酸史呢,但是想想自己的成果马上出炉了,心中还是会有小小的成就感呢!