天天看點

為資料通路層編寫一個基類(轉)

編寫資料通路層代碼時,總要一邊又一邊的重複編寫:讀資料庫連接配接字元串,建立資料庫連接配接對象,打開連接配接,建立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(); 

        } 

        /// 通過存儲過程傳回查詢表的資訊 

        /// <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]; 

        /// 通過存儲過程和參數傳回查詢表的資訊 

        /// <param name="sprocName"></param> 

        /// <param name="parameters"></param> 

        /// <returns></returns> 

        protected DataTable GetTable(string sprocName, SqlParameter[] parameters) 

                SqlParameterCollection sqlParams = mycm.Parameters; 

                //先清空原有的參數 

                mycm.Parameters.Clear(); 

                //給Command添加參數 

                foreach ( SqlParameter parameter in parameters ) 

                { 

                    mycm.Parameters.Add( parameter ); 

                } 

        /// 通過存儲過程及存儲過程參數執行對資料庫無傳回值的操作(如:新增,更新,删除等) 

        /// <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 ); 

            //打開連接配接 

                //執行 

                mycm.ExecuteNonQuery();  

                //關閉連接配接 

    } 

資料通路層代碼: 

    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);