【C#机房重构】----组合查询(模板方法+存储过程)

【主要内容】

  本篇博客主要是分享一下机房重构组合查询的相关操作,用到的方法有模板和存储过程。

【使用原因】

   相信大家在第一次机房收费系统的时候就发现很多相似的窗体,很多重复的代码,然后就直接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)//重写虚方法,<span style="font-family:KaiTi_GB2312;">将汉字换成数据库能识别的字母</span>  
        {  
            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

【总结】

  还得继续加油….

猜你喜欢

转载自blog.csdn.net/mabanana/article/details/80558255
今日推荐