在編寫數據訪問層代碼時,總要一邊又一邊的重複編寫:讀數據庫連接字符串,建立數據庫連接對象,打開連接,創建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,返回單值結果(如:查詢合計)……
|
|