在机房个人重构时虽然也使用了SQLHelper,但很多都是听他们说的要使用这个东西,自己也理解的很浅,在学习牛腩时恍然大悟,原来是这么一回事,正所谓之前是组装汽车,现在变为自己制造了,牛腩中看到了SQLHelper怎么一步步演化过来,其实它就是一个类,我们将对数据库操作共同的东西抽象出来封装在一个类里面,既然是对数据库操作,就包括查询和非查询,然后每种方法又包括带参和不带参,所以共有四种组合:不带参数和带参数的增删改、不带参数和带参数查询,然后在使用时根据需要给它传递一些参数进去。代码中是对四种方法的定义,其中这次除了使用try...catch,还用到using,用于定义一个范围,在此范围结束时释放资源。
public class SQLHelper
{
private SqlConnection conn = null;
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
public SQLHelper() //把共同的部分提炼出来,比如字符串连接和打开关闭数据库操作
{
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
conn = new SqlConnection(connStr);
}
private SqlConnection GetConn()
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
return conn;
}
/// <summary>
/// 执行不带参数增删改操作
/// </summary>
/// <param name="cmdText">sql语句或存储过程</param>
/// <param name="ct">命令类型</param>
/// <returns>受影响行数</returns>
public int ExecuteNonQuery(string cmdText,CommandType ct)
{
int res;
try
{
cmd = new SqlCommand(cmdText , GetConn());
cmd.CommandType = ct;
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (conn.State == ConnectionState.Open) //'如果数据库连接状态为关闭则将其打开
{
conn.Close();
}
}
return res;
}
/// <summary>
/// 执行带参数增删改操作
/// </summary>
/// <param name="cmdText">sql语句或存储过程</param>
/// <param name="ct">命令类型</param>
/// <returns>受影响行数</returns>
public int ExecuteNonQuery(string cmdText,SqlParameter []paras,CommandType ct)
{
int res;
using (cmd =new SqlCommand (cmdText ,GetConn ()))
{
cmd.CommandType = ct;
cmd.Parameters .AddRange (paras);
res =cmd.ExecuteNonQuery ();
}
return res ;
}
/// <summary>
/// 执行不带参数SQL语句查询或存错过程
/// </summary>
/// <param name="cmdText">sql语句或存错过程</param>
/// <param name="ct">命令类型</param>
/// <returns>受影响行数</returns>
public DataTable ExecuteQuery(string cmdText,CommandType ct)
{
DataTable dt=new DataTable ();
cmd =new SqlCommand (cmdText ,GetConn ());
cmd.CommandType = ct;
using(sdr =cmd .ExecuteReader (CommandBehavior .CloseConnection ))
{
dt.Load (sdr );
}
return dt;
}
/// <summary>
/// 执行带参数SQL语句查询或存错过程
/// </summary>
/// <param name="cmdText">sql语句或存错过程</param>
/// <param name="paras">参数数组</param>
/// <param name="ct">命令类型</param>
/// <returns>受影响行数</returns>
public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras,CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
}
小结:SQLHelper不仅实现代码的复用,还体现面向对象中抽象和封装的特点,上次写这个类和这次写感受是不一样的,正可谓学习是一个反复的过程,只有一次次的刺激才能理解的深刻,知识之间也都是想通的,我们要做的是领悟它的思想。 |