收费系统——SQLHelper类分析+重构

来源:互联网 发布:网络日报 编辑:程序博客网 时间:2024/06/06 03:55

前言:

    上回说到,重构时七层登录,未曾提起SQLHelper类,是因为该类是对访问数据库的增删改、有无参方法的一种整合,已经归并到D层。不过七层登录中的包图有所体现。本篇博客是Jackey在项目中的心得,我把漏洞的常规思路与重构后的SQLhelper进行了比较,当然漏洞依然有,还请各位上仙雅正!


人生若只如初见

    因为系统频繁的使用SQL语句访问数据库,为了减少代码冗余,访问数据库的SQL语句大概分为两大类:增删改(有无参)和查询(有无参),这里以有参的增删改为例,代码如下:

using System.IO;using System.Configuration;using System.Reflection;using System.Data;using System.Data.SqlClient;using System.Windows.Forms;public class SQLHelper{public DataTable ExecuteNonQuery(string cmdTxt,CommandType cmdType,SqlParameter[]paras)         {string StrDB=System.Configuration.ConfigurationManager.AppSettings["ConnStr"];//接收来自配置文件的数据SqlConnection conn = new SqlConnection(StrDB);//创建数据库连接SqlCommand cmd=default(SqlCommand);//定义命名变量DataSet adataset = null;//定义数据适配器,Dataset类表示一个存放在内存中数据缓存SqlDataAdapter adapter = default(SqlDataAdapter);cmd = new SqlCommand(cmdTxt,conn);//sqldataadapter类目的是填充datasetcmd.CommandType=cmdType ;//命令执行类型cmd.Parameters.AddRange(paras);//命令执行参数adapter = new SqlDataAdapter(cmd );//初始化新实例,用指定过的cmd作为selectcommand的属性adataset = new DataSet();             try{if (conn.State == ConnectionState.Closed){conn.Open();}adapter.Fill(adataset);向adapter对象中填充查询的数据。}catch (Exception ex){MessageBox.Show(ex.Message);}finally{if (conn.State==ConnectionState.Open ){conn.Close();}}return adataset.Tables[0];//获取包含在dataset中的表的集合}}

    代码如是写,未尝不可,不过如果像前言所说添加四个方法。是不是每次都要写连接数据库代码、打开关闭连接。重复冗余的代码可以构造函数,实例化便可执行同样的效果。

柳暗花明又一村

    这是重构后的代码:

using System.IO;using System.Configuration;using System.Reflection;using System.Data;using System.Data.SqlClient;using System.Windows.Forms;    public class SQLHelper    {        private SqlConnection conn = null;        private SqlCommand cmd = null;        private DataSet adataset = null;        private SqlDataAdapter adapter=null;                public SQLHelper()        {            string StrDB=System.Configuration.ConfigurationManager.AppSettings["ConnStr"];            //接收来自配置文件的数据            conn = new SqlConnection(StrDB);        }        private SqlConnection GetConn()        {            if (conn.State==ConnectionState.Closed)            {conn.Open();}            return conn;        }        /// <summary>        /// 有参增删改        /// </summary>        /// <param name="cmdTxt">SQL语句的增删改语句</param>        /// <param name="cmdType">SQL语句类型,可为存储过程</param>        /// <param name="paras">参数集合</param>        /// <returns></returns>        public DataTable ExecuteQuery(string cmdTxt,CommandType cmdType,SqlParameter[]paras)        {            cmd=default(SqlCommand);            adapter=default(SqlDataAdapter);            cmd = new SqlCommand(cmdTxt,conn);            cmd.CommandType = cmdType;            cmd.Parameters.AddRange(paras);            adapter= new SqlDataAdapter(cmd);            adataset = new DataSet();            adapter.Fill(adataset);            return adataset.Tables[0];        }



扩展

    关于SQLCommandType的属性,Text, TableDirect, StoredProcedure,分别对应的是传入的SQL语句、数据库表名、存储过程名称。这里可以直接把这三类作为参数传给SQLHelper,起到的作用是一样的,而且更方便,Jackey日后会有相关的介绍博客。

    关于SQLDataAdapter与SQLDataReader,前者是访问一次即可关闭连接,运用提取出来的数据;后者是即时访问,运用数据期间数据库连接不可中断,不然就会Bug,个人觉得采用SQLDataAdapter会让系统更稳定些,当然每一种方法都会有各自的优点。择优选择!


结语

    学习便是一个迭代相加的过程,也就是N=N+1的过程,学习就是+1,在不断发现问题、解决问题、参考他人经验、然后总结经验的过程就是把1整合到N的过程,以便于站在N的基础上继续学习。