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

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

目录
相关文章
|
消息中间件 关系型数据库 Kafka
深入理解数仓开发(二)数据技术篇之数据同步
深入理解数仓开发(二)数据技术篇之数据同步
|
10月前
|
机器学习/深度学习 人工智能 持续交付
利用AI进行代码审查:提升软件质量的新策略
【10月更文挑战第28天】本文探讨了AI在代码审查中的应用,介绍了AI如何通过静态代码分析、代码风格检查和实时反馈提升代码质量。文章还讨论了将AI工具集成到CI/CD流程、定制化规则和结合人工审查等进阶技巧,并推荐了SonarQube和DeepCode等实用工具。未来,AI代码审查工具将更加智能,助力软件开发。
|
SQL 监控 关系型数据库
mysql统计数据库大小
通过这些方法,数据库管理员可以有效地监控和规划MySQL数据库的存储需求,确保数据库的稳定运行。
196 2
|
9月前
|
XML JSON 前端开发
一文带你了解 Flutter dio封装
一文带你了解 Flutter dio封装
1317 1
|
消息中间件 Java 开发工具
消息队列 MQ使用问题之如何使用DefaultMQPushConsumer来消费消息
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
资源调度 前端开发 JavaScript
【前端规范全攻略】开启高效开发之旅!ESLint + Prettier + husky + lint-staged+Commitizen
如何统一代码风格,规范提交呢? 推荐使用`前端规范全家桶` ESLint + Prettier + husky + lint-staged。
716 0
【前端规范全攻略】开启高效开发之旅!ESLint + Prettier + husky + lint-staged+Commitizen
|
算法 API Go
微信小游戏获取用户相关api返回签名错误87009的解决方案
微信小游戏获取用户相关api返回签名错误87009的解决方案
|
传感器 自动驾驶 算法
Apollo开放平台概览 :自动驾驶的未来趋势
Apollo开放平台概览 :自动驾驶的未来趋势
239 2
|
负载均衡 Java 微服务
SpringCloud源码剖析-Zuul的自动配置和核心Filter详解
EnableZuulProxy的注释告诉我们,这里设设置Zuul服务器端点,和安装了一些反向代理过滤器,通过这些过滤器它可以转发请求到后端服务器,可以通过配置或通过DiscoveryClient手动注册后端服务(服务发现)
370 0

热门文章

最新文章