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

简介: 编写数据访问层代码时,总要一边又一边的重复编写:读数据库连接字符串,建立数据库连接对象,打开连接,创建Command对象,创建数据适配器,创建数据集,填充数据集,关闭连接。这种重复的代码写一两次到还行,写多了就免不了有一些烦了。

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

目录
相关文章
|
存储 弹性计算 JavaScript
面向对象-1:类的定义
本实验将介绍TypeScript中类的定义
|
12月前
|
Java
Java接口:实现多重继承,促进代码复用与扩展的强大工具
Java接口:实现多重继承,促进代码复用与扩展的强大工具
159 0
|
设计模式 Java
简化代码结构与提高灵活性:学习Java设计模式中的装饰器模式
简化代码结构与提高灵活性:学习Java设计模式中的装饰器模式
|
Java
4.2 内部类在事件处理中的应用:简化代码结构,提高代码可维护性
4.2 内部类在事件处理中的应用:简化代码结构,提高代码可维护性
98 0
|
设计模式 Java
2.1 为什么使用内部类:封装与可读性
2.1 为什么使用内部类:封装与可读性
64 0
|
设计模式
简化理解:策略设计模式
本篇带来另外一种设计模式介绍,你或许天天和它打交道,但是不认识它,它就是“策略模式”。
简化理解:策略设计模式
|
SQL 安全 搜索推荐
封装数据库操作类(优化)|学习笔记
快速学习封装数据库操作类(优化)
封装数据库操作类(优化)|学习笔记
|
SQL 安全 关系型数据库
封装数据库操作类(小结)|学习笔记
快速学习封装数据库操作类(小结)
|
SQL 网络安全 PHP
封装数据库操作类(构造方法)|学习笔记
快速学习封装数据库操作类(构造方法)
下一篇
无影云桌面