• 为数据访问层编写一个基类(转)


    编写数据访问层代码时,总要一边又一边的重复编写:读数据库连接字符串,建立数据库连接对象,打开连接,创建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); 
            } 
        } 

  • 相关阅读:
    【编程题目】左旋转字符串 ☆
    360測试开发笔试题(2016内推)
    start_kernel——boot_cpu_init及PER_CPU
    UVa 10673
    【面试】-Java基础知识
    Navgationcontroller 的pop
    别拿接口不当开发
    C++基础学习教程(三)
    安卓版微信自带浏览器和IE6浏览器ajax请求abort错误处理
    【动态树问题】LCT学习笔记
  • 原文地址:https://www.cnblogs.com/pyt5208/p/556996.html
Copyright © 2020-2023  润新知