為數據訪問層編寫一個基類

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- 為數據訪問層編寫一個基類 (http://www.webasp.net/article/18/17476.htm)
-- 作者:未知
-- 發佈日期: 2005-04-14
在編寫數據訪問層代碼時,總要一邊又一邊的重複編寫:讀數據庫連接字符串,建立數據庫連接對象,打開連接,創建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,返回單值結果(如:查詢合計)……

webasp.net