在编写数据访问层代码时,总要一边又一边的重复编写:读数据库连接字符串,建立数据库连接对象,打开连接,创建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,返回单值结果(如:查询合计)…… 
posted on 2008-07-02 15:32  yhb199  阅读(276)  评论(1编辑  收藏  举报