在编写数据访问层代码时,总要一边又一边的重复编写:读数据库连接字符串,建立数据库连接对象,打开连接,创建Command对象,创建数据适配器,创建数据集,填充数据集,关闭连接。这种重复的代码写一两次到还行,写多了就免不了有一些烦了。 在总结以前的代码以后,决定重构数据方法层的代码。数据访问层无非进行两种操作:查询返回DataTable,进行插入、更新、删除等无返回值的操作。只要增加一个数据访问层基类包含这些繁琐的代码,其余的数据访问层代码继承数据访问层基类,在调用基类函数时给出存储过程名称和存储过程参数即可。 数据访问层基类代码: using System; using System.Data; using System.Collections; using System.Data.SqlClient; namespace DAL { /// <summary> /// DALBase 的摘要说明。 /// 数据层访问基类,定义数据层访问公共的变量,方法 /// </summary> public class DALBase { //定义该类共用变量 private SqlConnection conn; // private SqlCommand mycm; // private DataSet myds; // private SqlDataAdapter myda; // /// <summary> /// 从web.config中读取数据库连接字符串 /// </summary> private string CONNSTR = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; public DALBase() { //构造函数,创建对象实例 conn = new SqlConnection(CONNSTR); mycm = conn.CreateCommand(); myds = new DataSet(); myda = new SqlDataAdapter(); } /// <summary> /// 通过存储过程返回查询表的信息 /// </summary> /// <param name="sprocName">存储过程名称</param> /// <returns>DataTable</returns> protected DataTable GetTable(string sprocName) { conn.Open(); try { mycm.CommandText = sprocName; mycm.CommandType = CommandType.StoredProcedure; myda.SelectCommand = mycm; myda.Fill(myds); } finally { //无论语句执行正确与否,都关闭连接释放资源 conn.Close(); } return myds.Tables[0]; } /// <summary> /// 通过存储过程和参数返回查询表的信息 /// </summary> /// <param name="sprocName"></param> /// <param name="parameters"></param> /// <returns></returns> protected DataTable GetTable(string sprocName, SqlParameter[] parameters) { conn.Open(); try { mycm.CommandText = sprocName; mycm.CommandType = CommandType.StoredProcedure; SqlParameterCollection sqlParams = mycm.Parameters; //先清空原有的参数 mycm.Parameters.Clear(); //给Command添加参数 foreach ( SqlParameter parameter in parameters ) { mycm.Parameters.Add( parameter ); } myda.SelectCommand = mycm; myda.Fill(myds); } finally { //无论语句执行正确与否,都关闭连接释放资源 conn.Close(); } return myds.Tables[0]; } /// <summary> /// 通过存储过程及存储过程参数执行对数据库无返回值的操作(如:新增,更新,删除等) /// </summary> /// <param name="sprocName">存储过程名称</param> /// <param name="parameters">存储过程参数</param> protected void SaveTale(string sprocName, SqlParameter[] parameters) { mycm.CommandText = sprocName; mycm.CommandType = CommandType.StoredProcedure; SqlParameterCollection sqlParams = mycm.Parameters; //先清空原有的参数 mycm.Parameters.Clear(); //给Command添加参数 foreach ( SqlParameter parameter in parameters ) { mycm.Parameters.Add( parameter ); } //打开连接 conn.Open(); try { //执行 mycm.ExecuteNonQuery(); } finally { //关闭连接 conn.Close(); } } } }
数据访问层代码: using System; using System.Data; using System.Collections; using System.Data.SqlClient; namespace DAL { public class Test : DALBase { public Test() { } public DataTable GetTestTable() { return base.GetTable("存储过程名称"); } public DataTable GetTestTableByXName(string XName) { SqlParameter[] parameters = { new SqlParameter( "@XName",SqlDbType.NVarChar,10 ) }; return base.GetTable("存储过程名称",parameters); } public void AddTestTable(string XName, string Description) { SqlParameter[] parameters = { new SqlParameter( "@XName",SqlDbType.NVarChar,10 ), new SqlParameter( "@Description",SqlDbType.NVarChar,100) }; //设置参数值 parameters[0].Value = XName; parameters[1].Value = Description; base.SaveTale("存储过程名称",parameters); } } }
大家有兴趣还可以帮忙扩充一下这个基类,比如增加通过SQL语句返回DataTable,返回单值结果(如:查询合计)…… 
|