数据访问层DAL(数据库访问抽象类DataProvider)
晒晒数据访问层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)的更多相关文章
- 数据访问层DAL
我们已经根据设计好的pdm文件生成数据库,下面我们一起完成数据库访问层需要的工作 在dal类库上点击右键,添加,新建项 选择“ADO.NET实体数据模型”,会自动命名“Model1” 选择“来自数据库 ...
- SpringBoot数据库访问(一)--------关系型数据库访问(RDBMS)
关系型数据库访问(RDBMS) 采用JdbcTemplate.MyBatis.JPA.Hibernate等技术. 一.JdbcTemplate工具 在pom.xml添加boot-starter-jdb ...
- sql service 从创建访问用户到数据库访问 【SQL】
create login [LoginMame] with password=[Pwd]--创建数据库登陆用户 create user [DBLoginName] for login [LoginMa ...
- 数据访问层 (DAO)
数据持久化 持久化:将程序中的数据在瞬间状态下和持久状态间转换的机制(JDBC) 主要持久化操作:保存.删除.读取.和查找. 采用面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性. ...
- step by step 之餐饮管理系统六(数据库访问模块)
距上次写的博客已经好几个月,一方面公司里面有很多的东西要学,平时的时候又要写代码,所以没有及时更新,不过现在还好,已经成型了,现在把之前的东西贴出来,先看一下现在做的几个界面吧.第一个界面是用颜色用区 ...
- 架构-层-DAL:DAL
ylbtech-架构-层-DAL:DAL DAL是数据访问层的英文缩写,即为数据访问层(Data Access Layer).其功能主要是负责数据库的访问.简单地说就是实现对数据表的Select(查询 ...
- 1.1 DAL数据访问层
分布式(Distributed)数据访问层(Data Access Layer),简称DAL,是利用MySQL Proxy.Memcached.集群等技术优点而构建的一个架构系统.主要目的是解决高并发 ...
- servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因
package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...
- 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据
package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...
随机推荐
- POJ 3041 Asteroids (最小点覆盖集)
题意 给出一个N*N的矩阵,有些格子上有障碍,要求每次消除一行或者一列的障碍,最少消除多少次可以全部清除障碍. 思路 把关键点取出来:一个障碍至少需要被它的行或者列中的一个消除. 也许是最近在做二分图 ...
- 浏览器HTML5支持程度测试
/********************************************************************* * 浏览器HTML5支持程度测试 * 说明: * 想知道对 ...
- php.ini配置中文详解
;;;;;;;;;;; ; 警告 ; ;;;;;;;;;;; ; 此配置文件是对于新安装的PHP的默认设置. ; 默认情况下,PHP使用此配置文件安装 ; 此配置针对开发目的,并且*不是*针对生产环境 ...
- 在Android应用中使用Clean架构
自从开始开发安卓应用,我一直感觉我可以做得更好.我看过不少烂代码,其中当然有我写的.安卓系统的复杂性加上烂代码势必酿成灾祸,所以从错误中成长就很重要.我Google了如何更好地开发应用,发现了这个叫做 ...
- tcprstat的使用方式
两种使用方式:1)本机直接在线采集:2)分析tcpdump采集到的离线pcap文件 1. 本机直接在线采集 参数: -p :指定只采集此TCP port的请求 -t : 采集输出的时间间 ...
- Ubuntu消息菜单(MessagingMenu)API
应用程序可以注册在消息菜单里显示消息,它也可以使用全局聊天状态项目. 注册 应用程序要在消息菜单里显示消息,必须满足以下条件: $HOME/.config/indicators/messages/ap ...
- Linux 中 x86 的内联汇编
工程中需要用到内联汇编,找到一篇不错的文章,趁机学习下. 原文地址:http://www.ibm.com/developerworks/cn/linux/sdk/assemble/inline/ 如果 ...
- PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
配置方法在网上可以搜到很多,一步步来就好了,但是由于步骤比较多,需要耐心仔细一点点,这是我自己记录的成功步骤: 1.PHP+Apache+MySQL的安装:PHP网站开发 2.phpMyAdmin的配 ...
- Windows Server 2003下ASP.NET无法识别IE11的解决方法【转】
http://www.iefans.net/windows-server-2003-asp-net-ie11-shibie/ 由于IE11对User-Agent字符串进行了比较大的改动,所以导致很多通 ...
- 编译arm64错误记录
响应2月底appstore 64位APP的上线要求,开始编译IOS arm64版本引擎库.编译arm64遇到一些问题,在此记录. 1. 数据类型的错误 __int64 相关,提示error: expe ...