【主要内容】 |
本篇博客主要是分享一下机房重构组合查询的相关操作,用到的方法有模板和存储过程。
【使用原因】 |
相信大家在第一次机房收费系统的时候就发现很多相似的窗体,很多重复的代码,然后就直接ctrl+c和ctrl+v然后稍加改动就可以了。但是在第二次重构的时候,学习了设计模式,也听同学和师父们讲了很多,重构的时候需要加设计模式,来减少代码的冗余等,所以有了这篇博客。
【模板方法】 |
首先来说一下的就是模板方法:
模板方法主要就是将每一个窗体相似的地方写到一个模板(父类)中,采用虚方法的方式。然后在创建子类去继承父类,然后在子类中通过重写的方法把内容写出来。
举例:
1、首先创建父窗体,把相同部分抽象出来。
2、创建继承的子窗体。
3、就创建成功了…
代码部分:
父窗体的父类代码
protected virtual void ToDgv(Entity.GroupCheck groupcheck)//通过实体将不同的内容显示在各个窗体中
{
}
public virtual string ToEnglish(string combo)//将汉字转换成数据库识别的形式
{
return "";
}
protected virtual string GetdbName()//获得数据库名字
{
return "";
}
子类中的代码:
private void frmWorkLog_Load(object sender, EventArgs e)
{
frmWorkLog frm = new frmWorkLog();
frm.Text = "工作记录查询";
//操作符
combFeild1.Items.Add("教师");
combFeild1.Items.Add("注册时间");
combFeild1.Items.Add("注册日期");
combFeild1.Items.Add("注销时间");
combFeild1.Items.Add("注销日期");
combFeild1.Items.Add("机器名");
combFeild2.Items.Add("教师");
combFeild2.Items.Add("注册时间");
combFeild2.Items.Add("注册日期");
combFeild2.Items.Add("注销时间");
combFeild2.Items.Add("注销日期");
combFeild2.Items.Add("机器名");
combFeild3.Items.Add("教师");
combFeild3.Items.Add("注册时间");
combFeild3.Items.Add("注册日期");
combFeild3.Items.Add("注销时间");
combFeild3.Items.Add("注销日期");
combFeild3.Items.Add("机器名");
}
public override string ToEnglish(string combo)//重写虚方法,"font-family:KaiTi_GB2312;">将汉字换成数据库能识别的字母
{
switch (combo )
{
case "教师":
return "UserID";
case "注册时间":
return "LoginTime";
case "注册日期":
return "LoginDate";
case "注销时间":
return "LogoutTime";
case "注销日期":
return "LogoutDate";
case"机器名":
return "Computer";
default :
return "";
}
}
protected override string GetdbName()//重写,表示需要查询的是worklog表
{
return "Worklog";
}
protected override void ToDgv(Entity .GroupCheck groupcheck)//重写,显示查询结果
{
DataTable dt = new DataTable();
jfChargeSystemFacade.GroupCheck fac = new jfChargeSystemFacade.GroupCheck();//调用外观的方法
dt = fac.GroupCheckFacade(groupcheck);
dataGridView1.DataSource = dt;
dataGridView1.Columns[0].HeaderText = "用户名";
dataGridView1.Columns[1].HeaderText = "水平";
dataGridView1.Columns[2].HeaderText = "注册时间";
dataGridView1.Columns[3].HeaderText = "注销时间";
dataGridView1.Columns[4].HeaderText = "注销日期";
dataGridView1.Columns[5].HeaderText = "注册日期";
dataGridView1.Columns[6].HeaderText = "机器名";
dataGridView1.Columns[7].HeaderText = "状态";
dataGridView1.Refresh();
}
实体层代码(Entity层):
//和之前写的实体层一样,不过可以把各个组合查询窗体所用到的字段同时写到一个类中。方便多个窗体去使用它。
DAL层代码:
public DataTable GroupCheck(Entity.GroupCheck GKstudent)
{
DataTable dt = new DataTable();
string sql = "GroupCheck";//存储过程
SqlParameter[] paras = new SqlParameter[]
{
new SqlParameter ("@Field1", GKstudent.CobField ),
new SqlParameter ("@Field2", GKstudent.CobField2 ),
new SqlParameter ("@Field3", GKstudent.CobField3 ),
new SqlParameter ("@Operator1", GKstudent.cobOperator1 ),
new SqlParameter ("@Operator2", GKstudent.cobOperator2 ),
new SqlParameter ("@Operator3", GKstudent.cobOperator3 ),
new SqlParameter ("@Content1", GKstudent.txtContent1 ),
new SqlParameter ("@Content2", GKstudent.txtContent2 ),
new SqlParameter ("@Content3", GKstudent.txtContent3 ),
new SqlParameter ("@Relation1", GKstudent.cobRelations1 ),
new SqlParameter ("@Relation2", GKstudent.cobRelations2 )
};
dt = sqlhelper.ExecuteQuery(sql, paras, CommandType.StoredProcedure);
return dt;
}
其他层的代码和之前窗体的代码类似。
【存储过程】 |
CREATE PROCEDURE [dbo].[PROC_GroupCheck]
-- Add the parameters for the stored procedure here
@DbName nvarchar(50),
@comboFields1 nvarchar(20),
@comboFields2 nvarchar(20),
@comboFields3 nvarchar(20),
@comboOperators1 nvarchar(10),
@comboOperators2 nvarchar(10),
@comboOperators3 nvarchar(10),
@textBox1 nvarchar(20),
@textBox2 nvarchar(20),
@textBox3 nvarchar(20),
@comboCheck1 nvarchar(10),
@comboCheck2 nvarchar(10)
AS
declare @TempSql varchar(500)--临时存放sql语句
--Char(32)是空格 插入(39)是单引号
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
--一个条件的查询
SET @TempSql='select * from '+@DbName+' where'+char(32)+@comboFields1+@comboOperators1+char(39)+@textBox1+char(39)
if(@comboCheck1!=null)
begin
--两个条件的查询
SET @TempSql=@TempSql+char(32)+@comboCheck1+char(32)+@comboFields2+@comboOperators2+char(39)+@textBox2+char(39)
if(@comboCheck2!=null)
begin
--三个条件的查询
SET @TempSql=@TempSql+char(32)+@comboCheck2+char(32)+@comboFields3+@comboOperators3+char(39)+@textBox3+char(39)
end
end
execute(@Tempsql)
END
【总结】 |
还得继续加油….