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