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

来源:转载

前言:

上回说到,重构时七层登录,未曾提起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类目的是填充dataset
cmd.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;
}///
/// 有参增删改
///

/// SQL语句的增删改语句
/// SQL语句类型,可为存储过程
/// 参数集合
///
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的基础上继续学习。

分享给朋友:
您可能感兴趣的文章:
随机阅读: