晒晒数据访问层DAL,看看你的项目数据访问层使用的是什么形式,数据访问性能比较

采用什么样的数据访问形式是软件编码很重要的一个环节,良好的数据访问形式不仅能够提搞代码的执行效率,协作能力,更重要的是对未来程序维护,功能扩展起到至关重要的作用。当然良好的设计模式可以为我们提供很多的选择,但面对实际问题,公司规模小考虑成本,资金投入少,软件逻辑不算复杂,功能较少,部分客户需求只需要单个功能模块,类似小型管理系统,门户网站,crm等,这也为众多IT人事提供了兼职的好机会。借鉴类似程序,cpy下部分代码,小修小改下数据库字段新的软件就大功告成。这种现状在弊端同时也很多程序没有通过完整的测试,部分存在漏洞,维护性不高,导致客户日常投诉反工现象时有发生,弄不好还会引起不必要的麻烦,为此组件一个高效便捷的快速开发框架,集成我们日常生活中的经验是十分有必要的。

这里我就结合几个项目中用到的简单的数据访问层简单和大家共同的学习探讨。

1、常用数据访问我们一般采用的都有:微软自带DBHelper

2、Enterprises Library微软企业库(Microsoft.Practices.EnterpriseLibrary.Common,Microsoft.Practices.EnterpriseLibrary.Data,Microsoft.Practices.ObjectBuilder)

3、这里我和大家共同探讨结合微软DBHelper的自定义的加强版SqlDataProvider.cs

数据库访问抽象类DataProvider.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data.SqlClient;

using System.Configuration;

using System.Data;

using System.Reflection;

using System.Data.OleDb;

namespace DAL

{

     ///<summary>

 /// 数据库访问抽象类

 ///</summary>

     public abstract class DataProvider

     {

         private static DataProvider _instance = null;

         public static DataProvider Instance

         {

             get

             {

                 if (_instance == null)

                  {

                     String strConnectionString = ConfigurationManager.ConnectionStrings["ConnnectionString"].ConnectionString;

 

                     String strConnectionType = ConfigurationManager.ConnectionStrings["ConnectionType"].ConnectionString;

                     if (strConnectionType.ToLower() == "sqlclient")

                     {

                         strConnectionType = "DAL.SqlDataProvider, DAL";

                     }

 

                     Type t = Type.GetType(strConnectionType);

                     Type[] paramTypes = new Type[1];

                     paramTypes[0] = typeof(String);

 

                     Object[] paramArray = new Object[1];

                     paramArray[0] = strConnectionString;

 

                     _instance = (DataProvider)((ConstructorInfo)t.GetConstructor(paramTypes)).Invoke(paramArray);

                 }

                 return _instance;

             }

         }

 

         #region 抽象属性和方法

 

         #region 数据库链接串

         public abstract String ConnectionString { get; }

         #endregion

 

         #region 执行SQL语句

         public abstract Object GetScalar(String selectSql);

         public abstract DataSet GetDataset(String selectSql);

         public virtual DataSet GetDatasetTrans(SqlTransaction trans, String selectSql) { return null; }

         public virtual DataSet GetDatasetTrans(OleDbTransaction trans, String selectSql) { return null; }

         public virtual DataSet GetDataset(String selectSql, SqlParameter[] para) { return null; }

         public virtual DataSet GetDataset(String selectSql, OleDbParameter[] para) { return null; }

         public virtual DataSet GetDatasetTrans(SqlTransaction trans, String selectSql, SqlParameter[] para) { return null; }

         public virtual DataSet GetDatasetTrans(OleDbTransaction trans, String selectSql, OleDbParameter[] para) { return null; }

         public abstract void Execute(String noneQuery);

         public virtual void Execute(String noneQuery, SqlParameter[] para) { }

         public virtual void Execute(String noneQuery, OleDbParameter[] para) { }

         public abstract IDataReader GetReader(String selectSql);

         public virtual IDataReader GetReaderTrans(SqlTransaction trans, String selectSql) { return null; }

         public virtual IDataReader GetReaderTrans(OleDbTransaction trans, String selectSql) { return null; }

         public virtual IDataReader GetReader(String selectSql, SqlParameter[] para) { return null; }

         public virtual IDataReader GetReader(String selectSql, OleDbParameter[] para) { return null; }

         public virtual IDataReader GetReaderTrans(SqlTransaction trans, String selectSql, SqlParameter[] para) { return null; }

         public virtual IDataReader GetReaderTrans(OleDbTransaction trans, String selectSql, OleDbParameter[] para) { return null; }

         #endregion

 

         #region 执行存储过程

         public abstract void ExecuteSp(String spName);

         public virtual void ExecuteSp(SqlTransaction trans, String spName) { }

         public virtual void ExecuteSp(OleDbTransaction trans, String spName) { }

         public virtual void ExecuteSp(String spName, SqlParameter[] para) { }

         public virtual void ExecuteSp(String spName, OleDbParameter[] para) { }

         public virtual void ExecuteSp(SqlTransaction trans, String spName, SqlParameter[] para) { }

         public virtual void ExecuteSp(OleDbTransaction trans, String spName, OleDbParameter[] para) { }

         public abstract IDataReader GetReaderBySp(String spName);

         public virtual IDataReader GetReaderBySp(String spName, SqlParameter[] para) { return null; }

         public virtual IDataReader GetReaderBySp(String spName, OleDbParameter[] para) { return null; }

         public abstract Object GetScalarBySp(String spName);

         public virtual Object GetScalarBySp(String spName, SqlParameter[] para) { return null; }

         public virtual Object GetScalarBySp(String spName, OleDbParameter[] para) { return null; }

         public abstract DataSet GetDatasetBySp(String spName);

         public virtual DataSet GetDatasetBySp(String spName, SqlParameter[] para) { return null; }

         public virtual DataSet GetDatasetBySp(String spName, OleDbParameter[] para) { return null; }

         #endregion

 

         #endregion

     }

 }

继承类SqlDataProvider:

using System;

sing System.Collections.Generic;

sing System.Linq;

sing System.Text;

sing System.Data;

sing System.Data.SqlClient;

amespace DAL

 

   public class SqlDataProvider : DataProvider

   {

       private String _connectionString = String.Empty;

 

       public SqlDataProvider(String connString)

       {

           _connectionString = connString;

       }

 

       #region 实现抽象方法

 

       #region 数据库链接串

       public override String ConnectionString

       {

           get

           {

               return _connectionString;

           }

       }

 

       #endregion

 

       #region 执行SQL语句

 

       ///<summary>

// 执行查询获取单值

//</summary>

//<param name="selectSql">查询语句</param>

//<returns>返回Object</returns>

      public override Object GetScalar(String selectSql)

       {

           return SqlHelper.ExecuteScalar(_connectionString,

               CommandType.Text, selectSql);

       }

 

       ///<summary>

// 根据查询语句获取数据集

//</summary>

//<param name="selectSql">查询语句</param>

//<returns>返回数据集</returns>

       public override DataSet GetDataset(String selectSql)

       {

           if (selectSql == null) throw new ArgumentNullException("selectSql");

 

           DataSet ds = new DataSet();

           SqlHelper.FillDataset(_connectionString, CommandType.Text, selectSql, ds, null);

           return ds;

       }

 

       ///<summary>

// 根据查询语句获取数据集

//</summary>

//<param name="trans">事务</param>

//<param name="selectSql">查询语句</param>

//<returns>返回数据集</returns>

       public override DataSet GetDatasetTrans(SqlTransaction trans, String selectSql)

       {

           if (selectSql == null) throw new ArgumentNullException("selectSql");

 

           DataSet ds = new DataSet();

           SqlHelper.FillDataset(trans, CommandType.Text, selectSql, ds, null);

           return ds;

       }

 

       ///<summary>

// 根据带参数的查询语句获取数据集

//</summary>

//<param name="selectSql">查询语句</param>

//<param name="para">参数列表</param>

//<returns>返回数据集</returns>

       public override DataSet GetDataset(String selectSql, SqlParameter[] para)

       {

           if (selectSql == null) throw new ArgumentNullException("selectSql");

           if (para == null) throw new ArgumentNullException("para");

 

          DataSet ds = new DataSet();

            SqlHelper.FillDataset(_connectionString, CommandType.Text, selectSql, ds, null, para);

            return ds;

        }

 

        ///<summary>

/// 根据带参数的查询语句获取数据集

///</summary>

///<param name="trans">事务</param>

///<param name="selectSql">查询语句</param>

///<param name="para">参数列表</param>

///<returns>返回数据集</returns>

        public override DataSet GetDatasetTrans(SqlTransaction trans, String selectSql, SqlParameter[] para)

        {

            if (selectSql == null) throw new ArgumentNullException("selectSql");

            if (para == null) throw new ArgumentNullException("para");

 

           DataSet ds = new DataSet();

           SqlHelper.FillDataset(trans, CommandType.Text, selectSql, ds, null, para);

           return ds;

       }

 

       ///<summary>

// 在某个数据库连接对象上执行查询语句获取数据集

//</summary>

//<param name="cn">数据库连接对象</param>

//<param name="selectSql">查询语句</param>

//<returns>返回数据集</returns>

       public static DataSet GetDataset(SqlConnection conn, String selectSql)

       {

           if (conn == null) throw new ArgumentNullException("conn");

           if (selectSql == null) throw new ArgumentNullException("selectSql");

 

           DataSet ds = new DataSet();

           SqlHelper.FillDataset(conn, CommandType.Text, selectSql, ds, null);

           return ds;

       }

 

       ///<summary>

// 执行非查询语句

//</summary>

//<param name="noneQuery">非查询sql语句</param>

       public override void Execute(String noneQuery)

       {

           if (noneQuery == null) throw new ArgumentNullException("noneQuery");

 

           SqlHelper.ExecuteNonQuery(_connectionString, CommandType.Text, noneQuery);

       }

 

       ///<summary>

// 执行非查询语句

//</summary>

//<param name="noneQuery">非查询sql语句</param>

//<param name="para">参数列表</param>

       public override void Execute(String noneQuery, SqlParameter[] para)

       {

           if (noneQuery == null) throw new ArgumentNullException("noneQuery");

           if (para == null) throw new ArgumentNullException("para");

 

           SqlHelper.ExecuteNonQuery(_connectionString, CommandType.Text, noneQuery, para);

       }

 

       ///<summary>

// 执行查询语句获取Reader对象

//</summary>

//<param name="selectSql">查询语句</param>

//<returns>返回DataReader</returns>

       public override IDataReader GetReader(String selectSql)

       {

           if (selectSql == null) throw new ArgumentNullException("selectSql");

 

           return SqlHelper.ExecuteReader(_connectionString, CommandType.Text, selectSql);

       }

 

       ///<summary>

// 执行查询语句获取Reader对象

//</summary>

/<param name="trans">事务</param>

//<param name="selectSql">查询语句</param>

//<returns>返回DataReader</returns>

       public override IDataReader GetReaderTrans(SqlTransaction trans, String selectSql)

       {

           if (selectSql == null) throw new ArgumentNullException("selectSql");

 

           return SqlHelper.ExecuteReader(trans, CommandType.Text, selectSql);

       }

 

       ///<summary>

// 执行查询语句获取Reader对象

//</summary>

//<param name="selectSql">查询语句</param>

//<param name="para">参数列表</param>

//<returns>返回DataReader</returns>

       public override IDataReader GetReader(String selectSql, SqlParameter[] para)

       {

           if (selectSql == null) throw new ArgumentNullException("selectSql");

          if (para == null) throw new ArgumentNullException("para");

 

           return SqlHelper.ExecuteReader(_connectionString, CommandType.Text, selectSql, para);

       }

 

       ///<summary>

// 执行查询语句获取Reader对象

//</summary>

//<param name="trans">事务</param>

//<param name="selectSql">查询语句</param>

//<param name="para">参数列表</param>

//<returns>返回DataReader</returns>

       public override IDataReader GetReaderTrans(SqlTransaction trans, String selectSql, SqlParameter[] para)

       {

           if (selectSql == null) throw new ArgumentNullException("selectSql");

           if (para == null) throw new ArgumentNullException("para");

 

           return SqlHelper.ExecuteReader(trans, CommandType.Text, selectSql, para);

       }

 

       #endregion

 

       #region 执行存储过程

       ///<summary>

// 执行非查询存储过程

//</summary>

//<param name="spName">存储过程名称</param>

       public override void ExecuteSp(String spName)

      {

           if (spName == null) throw new ArgumentNullException("spName");

 

           SqlHelper.ExecuteNonQuery(_connectionString, CommandType.StoredProcedure, spName);

       }

 

       ///<summary>

// 执行非查询存储过程

//</summary>

//<param name="trans">事务对象</param>

/<param name="spName">存储过程名称</param>

       public override void ExecuteSp(SqlTransaction trans, String spName)

       {

           if (trans == null) throw new ArgumentNullException("trans");

           if (spName == null) throw new ArgumentNullException("spName");

 

          SqlHelper.ExecuteNonQuery(trans, CommandType.StoredProcedure, spName);

       }

 

       ///<summary>

// 执行非查询存储过程

//</summary>

//<param name="spName">存储过程名称</param>

//<param name="para">参数列表</param>

       public override void ExecuteSp(String spName, SqlParameter[] para)

       {

           if (spName == null) throw new ArgumentNullException("spName");

           if (para == null) throw new ArgumentNullException("para");

 

           SqlHelper.ExecuteNonQuery(_connectionString, CommandType.StoredProcedure, spName, para);

       }

 

      /// 执行非查询存储过程

//</summary>

//<param name="trans">事务对象</param>

//<param name="spName">存储过程名称</param>

//<param name="para">参数列表</param>

       public override void ExecuteSp(SqlTransaction trans, String spName, SqlParameter[] para)

       {

           if (trans == null) throw new ArgumentNullException("trans");

           if (spName == null) throw new ArgumentNullException("spName");

           if (para == null) throw new ArgumentNullException("para");

 

           SqlHelper.ExecuteNonQuery(trans, CommandType.StoredProcedure,

               spName, para);

       }

 

       ///<summary>

// 执行查询存储过程获取Reader对象

//</summary>

//<param name="spName">存储过程名称</param>

//<returns>返回DataReader</returns>

       public override IDataReader GetReaderBySp(String spName)

       {

           if (spName == null) throw new ArgumentNullException("spName");

           return SqlHelper.ExecuteReader(_connectionString,

               CommandType.StoredProcedure, spName);

       }

 

       ///<summary>

// 执行查询存储过程获取Reader对象

//</summary>

//<param name="spName">存储过程名称</param>

//<param name="para">参数列表</param>

//<returns>返回DataReader</returns>

       public override IDataReader GetReaderBySp(String spName, SqlParameter[] para)

       {

           return SqlHelper.ExecuteReader(_connectionString,

               CommandType.StoredProcedure, spName, para);

       }

 

      ///<summary>

// 执行查询存储过程获取单值

//</summary>

//<param name="spName">存储过程名称</param>

//<returns>返回Object</returns>

       public override Object GetScalarBySp(String spName)

       {

           return SqlHelper.ExecuteScalar(_connectionString,

               CommandType.StoredProcedure, spName);

       }

 

       ///<summary>

// 执行查询存储过程获取单值

//</summary>

//<param name="spName">存储过程名称</param>

//<param name="para">参数列表</param>

//<returns>返回Object</returns>

       public override Object GetScalarBySp(String spName, SqlParameter[] para)

      {

           return SqlHelper.ExecuteScalar(_connectionString,

              CommandType.StoredProcedure, spName, para);

       }

 

       ///<summary>

// 根据存储过程获取数据集

//</summary>

//<param name="spName">存储过程</param>

//<returns>返回数据集</returns>

       public override DataSet GetDatasetBySp(String spName)

       {

           if (spName == null) throw new ArgumentNullException("spName");

 

          DataSet ds = new DataSet();

           SqlHelper.FillDataset(_connectionString, CommandType.StoredProcedure, spName, ds, null);

           return ds;

      }

       ///<summary>

// 根据带参数的存储过程获取数据集

//</summary>

//<param name="spName">存储过程</param>

//<param name="para">参数列表</param>

//<returns>返回数据集</returns>

       public override DataSet GetDatasetBySp(String spName, SqlParameter[] para)

       {

           if (spName == null) throw new ArgumentNullException("spName");

          if (para == null) throw new ArgumentNullException("para");

 

           DataSet ds = new DataSet();

           SqlHelper.FillDataset(_connectionString, CommandType.StoredProcedure, spName, ds, null, para);

          return ds;

       }

       #endregion

 

       #endregion

   }

 

微软本身是的SqlHelper类提供高性能可扩充的数据库访问方法,代码就不啰嗦大家都懂的,通过集成和改造对数据访问的安全性,扩展性做进一步的伸展

测试 同时加载1w条数据试一试,方法执行时间,忽略浏览器加载时间

改造数据访问:

方法执行时间

企业库:

方法执行时间

普通DBHlper:

方法执行时间

同时加载10W条数据试一试:

改造后10W条数据访问时间:

企业库10W数据访问时间:

普通DBHelper,10W条数据访问时间:

当然了测试和机器配置也相关,以上数据仅供参考,不一定准确,还有很多地方不是很完善,你的项目采用的是什么数据交互模式来?有没有更好的意见和建议,期待达人们的意见和建议。

数据访问层DAL(数据库访问抽象类DataProvider)的更多相关文章

  1. 数据访问层DAL

    我们已经根据设计好的pdm文件生成数据库,下面我们一起完成数据库访问层需要的工作 在dal类库上点击右键,添加,新建项 选择“ADO.NET实体数据模型”,会自动命名“Model1” 选择“来自数据库 ...

  2. SpringBoot数据库访问(一)--------关系型数据库访问(RDBMS)

    关系型数据库访问(RDBMS) 采用JdbcTemplate.MyBatis.JPA.Hibernate等技术. 一.JdbcTemplate工具 在pom.xml添加boot-starter-jdb ...

  3. sql service 从创建访问用户到数据库访问 【SQL】

    create login [LoginMame] with password=[Pwd]--创建数据库登陆用户 create user [DBLoginName] for login [LoginMa ...

  4. 数据访问层 (DAO)

    数据持久化 持久化:将程序中的数据在瞬间状态下和持久状态间转换的机制(JDBC) 主要持久化操作:保存.删除.读取.和查找. 采用面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性. ...

  5. step by step 之餐饮管理系统六(数据库访问模块)

    距上次写的博客已经好几个月,一方面公司里面有很多的东西要学,平时的时候又要写代码,所以没有及时更新,不过现在还好,已经成型了,现在把之前的东西贴出来,先看一下现在做的几个界面吧.第一个界面是用颜色用区 ...

  6. 架构-层-DAL:DAL

    ylbtech-架构-层-DAL:DAL DAL是数据访问层的英文缩写,即为数据访问层(Data Access Layer).其功能主要是负责数据库的访问.简单地说就是实现对数据表的Select(查询 ...

  7. 1.1 DAL数据访问层

    分布式(Distributed)数据访问层(Data Access Layer),简称DAL,是利用MySQL Proxy.Memcached.集群等技术优点而构建的一个架构系统.主要目的是解决高并发 ...

  8. servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因

    package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...

  9. 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据

    package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...

随机推荐

  1. MetadataType的使用,MVC的Model层数据验证

    MetadataType的使用,MVC的Model层数据验证 指定要与数据模型类关联的元数据类   using System.ComponentModel.DataAnnotations; //指定要 ...

  2. CentOS6.2下fastDFS的完整安装和配置步骤

    centos6.2系统下安装配置FastDFS步骤: 1:安装libevent(libevent-2.0.16-stable) ##卸载系统自带libevent rpm -qa|grep libeve ...

  3. 图解VS2010打包全过程

    原文转自:http://blog.csdn.net/shan9liang/article/details/6957308 最近刚刚打包发布了用VS2010开发的一个收费系统,借此讲一讲打包过程,供大家 ...

  4. SVN版本管理提示信息

    1. FAQ 1.路径或权限不足时将出现错误信息提示: http://192.134.4.251/svn/svnproject(路径不对)Error * PROPFIND request failed ...

  5. WAPI

    中国制定的WLAN安全标准WAPI 针对WLAN安全问题,中国制定了自己的WLAN安全标准:WAPI. 与其他无线局域网安全机制(如802.11i)相比,WAPI主要的差别体现在以下几个方面: • 双 ...

  6. 基于ASP.NET MVC和Bootstrap搭建响应式个人博客站(一)

    1.0 为什么要做这个博客站? www.zynblog.com   在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个 ...

  7. Windows 窗体最小化和隐藏的区别及恢复

    应用程序有托盘图标,窗体最小化或者隐藏窗体时,点击托盘图标需要恢复窗体显示,并且恢复之前的现实状体,正常大小或者最大化显示.例如:最大化显示窗体时,点击最小化按钮,窗体最小化,点击托盘图标将最大化显示 ...

  8. 2016计蒜之道复赛 百度地图的实时路况 floyd+cdq分治

    链接:https://nanti.jisuanke.com/t/11217 奉上官方题解: 枚举 d(x , y , z) 中的 y,把 y 从这个图中删去,再求这时的全源最短路即可,使用 Floyd ...

  9. HDU-1584 蜘蛛牌(dfs)

    可以多看看. 蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  10. DIV+CSS常见问题:DIV如何设置一个像素高度?

    CSS如何控制DIV实现1像素高度呢?问题看起来很简单,但万恶的IE6会让你很麻烦,不过解决办法很多,本文将介绍最简单的一种:DIV{height:1px;line-height:1px;font-s ...