為數據訪問層編寫一個基類
2024-07-21 02:22:57
供稿:網友
 
在編寫數據訪問層代碼時,總要一邊又一邊的重復編寫:讀數據庫連接字符串,建立數據庫連接對象,打開連接,創建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,返回單值結果(如:查詢合計)……