数据访问层DAL(数据库访问抽象类DataProvider)
2013-10-14 12:19
253 查看
晒晒数据访问层DAL,看看你的项目数据访问层使用的是什么形式,数据访问性能比较
采用什么样的数据访问形式是软件编码很重要的一个环节,良好的数据访问形式不仅能够提搞代码的执行效率,协作能力,更重要的是对未来程序维护,功能扩展起到至关重要的作用。当然良好的设计模式可以为我们提供很多的选择,但面对实际问题,公司规模小考虑成本,资金投入少,软件逻辑不算复杂,功能较少,部分客户需求只需要单个功能模块,类似小型管理系统,门户网站,crm等,这也为众多IT人事提供了兼职的好机会。借鉴类似程序,cpy下部分代码,小修小改下数据库字段新的软件就大功告成。这种现状在弊端同时也很多程序没有通过完整的测试,部分存在漏洞,维护性不高,导致客户日常投诉反工现象时有发生,弄不好还会引起不必要的麻烦,为此组件一个高效便捷的快速开发框架,集成我们日常生活中的经验是十分有必要的。
这里我就结合几个项目中用到的简单的数据访问层简单和大家共同的学习探讨。
1、常用数据访问我们一般采用的都有:微软自带DBHelper
2、EnterprisesLibrary微软企业库(Microsoft.Practices.EnterpriseLibrary.Common,Microsoft.Practices.EnterpriseLibrary.Data,Microsoft.Practices.ObjectBuilder)
3、这里我和大家共同探讨结合微软DBHelper的自定义的加强版SqlDataProvider.cs
数据库访问抽象类DataProvider.cs
继承类SqlDataProvider:
微软本身是的SqlHelper类提供高性能可扩充的数据库访问方法,代码就不啰嗦大家都懂的,通过集成和改造对数据访问的安全性,扩展性做进一步的伸展
测试同时加载1w条数据试一试,方法执行时间,忽略浏览器加载时间
改造数据访问:
方法执行时间
企业库:
方法执行时间
普通DBHlper:
方法执行时间
同时加载10W条数据试一试:
改造后10W条数据访问时间:
企业库10W数据访问时间:
普通DBHelper,10W条数据访问时间:
当然了测试和机器配置也相关,以上数据仅供参考,不一定准确,还有很多地方不是很完善,你的项目采用的是什么数据交互模式来?有没有更好的意见和建议,期待达人们的意见和建议。
采用什么样的数据访问形式是软件编码很重要的一个环节,良好的数据访问形式不仅能够提搞代码的执行效率,协作能力,更重要的是对未来程序维护,功能扩展起到至关重要的作用。当然良好的设计模式可以为我们提供很多的选择,但面对实际问题,公司规模小考虑成本,资金投入少,软件逻辑不算复杂,功能较少,部分客户需求只需要单个功能模块,类似小型管理系统,门户网站,crm等,这也为众多IT人事提供了兼职的好机会。借鉴类似程序,cpy下部分代码,小修小改下数据库字段新的软件就大功告成。这种现状在弊端同时也很多程序没有通过完整的测试,部分存在漏洞,维护性不高,导致客户日常投诉反工现象时有发生,弄不好还会引起不必要的麻烦,为此组件一个高效便捷的快速开发框架,集成我们日常生活中的经验是十分有必要的。
这里我就结合几个项目中用到的简单的数据访问层简单和大家共同的学习探讨。
1、常用数据访问我们一般采用的都有:微软自带DBHelper
2、EnterprisesLibrary微软企业库(Microsoft.Practices.EnterpriseLibrary.Common,Microsoft.Practices.EnterpriseLibrary.Data,Microsoft.Practices.ObjectBuilder)
3、这里我和大家共同探讨结合微软DBHelper的自定义的加强版SqlDataProvider.cs
数据库访问抽象类DataProvider.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Data.SqlClient;
usingSystem.Configuration;
usingSystem.Data;
usingSystem.Reflection;
usingSystem.Data.OleDb;
namespaceDAL
{
///<summary>
///数据库访问抽象类
///</summary>
publicabstractclassDataProvider
{
privatestaticDataProvider_instance=null;
publicstaticDataProviderInstance
{
get
{
if(_instance==null)
{
StringstrConnectionString=ConfigurationManager.ConnectionStrings["ConnnectionString"].ConnectionString;
StringstrConnectionType=ConfigurationManager.ConnectionStrings["ConnectionType"].ConnectionString;
if(strConnectionType.ToLower()=="sqlclient")
{
strConnectionType="DAL.SqlDataProvider,DAL";
}
Typet=Type.GetType(strConnectionType);
Type[]paramTypes=newType[1];
paramTypes[0]=typeof(String);
Object[]paramArray=newObject[1];
paramArray[0]=strConnectionString;
_instance=(DataProvider)((ConstructorInfo)t.GetConstructor(paramTypes)).Invoke(paramArray);
}
return_instance;
}
}
#region抽象属性和方法
#region数据库链接串
publicabstractStringConnectionString{get;}
#endregion
#region执行SQL语句
publicabstractObjectGetScalar(StringselectSql);
publicabstractDataSetGetDataset(StringselectSql);
publicvirtualDataSetGetDatasetTrans(SqlTransactiontrans,StringselectSql){returnnull;}
publicvirtualDataSetGetDatasetTrans(OleDbTransactiontrans,StringselectSql){returnnull;}
publicvirtualDataSetGetDataset(StringselectSql,SqlParameter[]para){returnnull;}
publicvirtualDataSetGetDataset(StringselectSql,OleDbParameter[]para){returnnull;}
publicvirtualDataSetGetDatasetTrans(SqlTransactiontrans,StringselectSql,SqlParameter[]para){returnnull;}
publicvirtualDataSetGetDatasetTrans(OleDbTransactiontrans,StringselectSql,OleDbParameter[]para){returnnull;}
publicabstractvoidExecute(StringnoneQuery);
publicvirtualvoidExecute(StringnoneQuery,SqlParameter[]para){}
publicvirtualvoidExecute(StringnoneQuery,OleDbParameter[]para){}
publicabstractIDataReaderGetReader(StringselectSql);
publicvirtualIDataReaderGetReaderTrans(SqlTransactiontrans,StringselectSql){returnnull;}
publicvirtualIDataReaderGetReaderTrans(OleDbTransactiontrans,StringselectSql){returnnull;}
publicvirtualIDataReaderGetReader(StringselectSql,SqlParameter[]para){returnnull;}
publicvirtualIDataReaderGetReader(StringselectSql,OleDbParameter[]para){returnnull;}
publicvirtualIDataReaderGetReaderTrans(SqlTransactiontrans,StringselectSql,SqlParameter[]para){returnnull;}
publicvirtualIDataReaderGetReaderTrans(OleDbTransactiontrans,StringselectSql,OleDbParameter[]para){returnnull;}
#endregion
#region执行存储过程
publicabstractvoidExecuteSp(StringspName);
publicvirtualvoidExecuteSp(SqlTransactiontrans,StringspName){}
publicvirtualvoidExecuteSp(OleDbTransactiontrans,StringspName){}
publicvirtualvoidExecuteSp(StringspName,SqlParameter[]para){}
publicvirtualvoidExecuteSp(StringspName,OleDbParameter[]para){}
publicvirtualvoidExecuteSp(SqlTransactiontrans,StringspName,SqlParameter[]para){}
publicvirtualvoidExecuteSp(OleDbTransactiontrans,StringspName,OleDbParameter[]para){}
publicabstractIDataReaderGetReaderBySp(StringspName);
publicvirtualIDataReaderGetReaderBySp(StringspName,SqlParameter[]para){returnnull;}
publicvirtualIDataReaderGetReaderBySp(StringspName,OleDbParameter[]para){returnnull;}
publicabstractObjectGetScalarBySp(StringspName);
publicvirtualObjectGetScalarBySp(StringspName,SqlParameter[]para){returnnull;}
publicvirtualObjectGetScalarBySp(StringspName,OleDbParameter[]para){returnnull;}
publicabstractDataSetGetDatasetBySp(StringspName);
publicvirtualDataSetGetDatasetBySp(StringspName,SqlParameter[]para){returnnull;}
publicvirtualDataSetGetDatasetBySp(StringspName,OleDbParameter[]para){returnnull;}
#endregion
#endregion
}
}
继承类SqlDataProvider:
usingSystem;
singSystem.Collections.Generic;
singSystem.Linq;
singSystem.Text;
singSystem.Data;
singSystem.Data.SqlClient;
amespaceDAL
publicclassSqlDataProvider:DataProvider
{
privateString_connectionString=String.Empty;
publicSqlDataProvider(StringconnString)
{
_connectionString=connString;
}
#region实现抽象方法
#region数据库链接串
publicoverrideStringConnectionString
{
get
{
return_connectionString;
}
}
#endregion
#region执行SQL语句
///<summary>
//执行查询获取单值
//</summary>
//<paramname="selectSql">查询语句</param>
//<returns>返回Object</returns>
publicoverrideObjectGetScalar(StringselectSql)
{
returnSqlHelper.ExecuteScalar(_connectionString,
CommandType.Text,selectSql);
}
///<summary>
//根据查询语句获取数据集
//</summary>
//<paramname="selectSql">查询语句</param>
//<returns>返回数据集</returns>
publicoverrideDataSetGetDataset(StringselectSql)
{
if(selectSql==null)thrownewArgumentNullException("selectSql");
DataSetds=newDataSet();
SqlHelper.FillDataset(_connectionString,CommandType.Text,selectSql,ds,null);
returnds;
}
///<summary>
//根据查询语句获取数据集
//</summary>
//<paramname="trans">事务</param>
//<paramname="selectSql">查询语句</param>
//<returns>返回数据集</returns>
publicoverrideDataSetGetDatasetTrans(SqlTransactiontrans,StringselectSql)
{
if(selectSql==null)thrownewArgumentNullException("selectSql");
DataSetds=newDataSet();
SqlHelper.FillDataset(trans,CommandType.Text,selectSql,ds,null);
returnds;
}
///<summary>
//根据带参数的查询语句获取数据集
//</summary>
//<paramname="selectSql">查询语句</param>
//<paramname="para">参数列表</param>
//<returns>返回数据集</returns>
publicoverrideDataSetGetDataset(StringselectSql,SqlParameter[]para)
{
if(selectSql==null)thrownewArgumentNullException("selectSql");
if(para==null)thrownewArgumentNullException("para");
DataSetds=newDataSet();
SqlHelper.FillDataset(_connectionString,CommandType.Text,selectSql,ds,null,para);
returnds;
}
///<summary>
///根据带参数的查询语句获取数据集
///</summary>
///<paramname="trans">事务</param>
///<paramname="selectSql">查询语句</param>
///<paramname="para">参数列表</param>
///<returns>返回数据集</returns>
publicoverrideDataSetGetDatasetTrans(SqlTransactiontrans,StringselectSql,SqlParameter[]para)
{
if(selectSql==null)thrownewArgumentNullException("selectSql");
if(para==null)thrownewArgumentNullException("para");
DataSetds=newDataSet();
SqlHelper.FillDataset(trans,CommandType.Text,selectSql,ds,null,para);
returnds;
}
///<summary>
//在某个数据库连接对象上执行查询语句获取数据集
//</summary>
//<paramname="cn">数据库连接对象</param>
//<paramname="selectSql">查询语句</param>
//<returns>返回数据集</returns>
publicstaticDataSetGetDataset(SqlConnectionconn,StringselectSql)
{
if(conn==null)thrownewArgumentNullException("conn");
if(selectSql==null)thrownewArgumentNullException("selectSql");
DataSetds=newDataSet();
SqlHelper.FillDataset(conn,CommandType.Text,selectSql,ds,null);
returnds;
}
///<summary>
//执行非查询语句
//</summary>
//<paramname="noneQuery">非查询sql语句</param>
publicoverridevoidExecute(StringnoneQuery)
{
if(noneQuery==null)thrownewArgumentNullException("noneQuery");
SqlHelper.ExecuteNonQuery(_connectionString,CommandType.Text,noneQuery);
}
///<summary>
//执行非查询语句
//</summary>
//<paramname="noneQuery">非查询sql语句</param>
//<paramname="para">参数列表</param>
publicoverridevoidExecute(StringnoneQuery,SqlParameter[]para)
{
if(noneQuery==null)thrownewArgumentNullException("noneQuery");
if(para==null)thrownewArgumentNullException("para");
SqlHelper.ExecuteNonQuery(_connectionString,CommandType.Text,noneQuery,para);
}
///<summary>
//执行查询语句获取Reader对象
//</summary>
//<paramname="selectSql">查询语句</param>
//<returns>返回DataReader</returns>
publicoverrideIDataReaderGetReader(StringselectSql)
{
if(selectSql==null)thrownewArgumentNullException("selectSql");
returnSqlHelper.ExecuteReader(_connectionString,CommandType.Text,selectSql);
}
///<summary>
//执行查询语句获取Reader对象
//</summary>
/<paramname="trans">事务</param>
//<paramname="selectSql">查询语句</param>
//<returns>返回DataReader</returns>
publicoverrideIDataReaderGetReaderTrans(SqlTransactiontrans,StringselectSql)
{
if(selectSql==null)thrownewArgumentNullException("selectSql");
returnSqlHelper.ExecuteReader(trans,CommandType.Text,selectSql);
}
///<summary>
//执行查询语句获取Reader对象
//</summary>
//<paramname="selectSql">查询语句</param>
//<paramname="para">参数列表</param>
//<returns>返回DataReader</returns>
publicoverrideIDataReaderGetReader(StringselectSql,SqlParameter[]para)
{
if(selectSql==null)thrownewArgumentNullException("selectSql");
if(para==null)thrownewArgumentNullException("para");
returnSqlHelper.ExecuteReader(_connectionString,CommandType.Text,selectSql,para);
}
///<summary>
//执行查询语句获取Reader对象
//</summary>
//<paramname="trans">事务</param>
//<paramname="selectSql">查询语句</param>
//<paramname="para">参数列表</param>
//<returns>返回DataReader</returns>
publicoverrideIDataReaderGetReaderTrans(SqlTransactiontrans,StringselectSql,SqlParameter[]para)
{
if(selectSql==null)thrownewArgumentNullException("selectSql");
if(para==null)thrownewArgumentNullException("para");
returnSqlHelper.ExecuteReader(trans,CommandType.Text,selectSql,para);
}
#endregion
#region执行存储过程
///<summary>
//执行非查询存储过程
//</summary>
//<paramname="spName">存储过程名称</param>
publicoverridevoidExecuteSp(StringspName)
{
if(spName==null)thrownewArgumentNullException("spName");
SqlHelper.ExecuteNonQuery(_connectionString,CommandType.StoredProcedure,spName);
}
///<summary>
//执行非查询存储过程
//</summary>
//<paramname="trans">事务对象</param>
/<paramname="spName">存储过程名称</param>
publicoverridevoidExecuteSp(SqlTransactiontrans,StringspName)
{
if(trans==null)thrownewArgumentNullException("trans");
if(spName==null)thrownewArgumentNullException("spName");
SqlHelper.ExecuteNonQuery(trans,CommandType.StoredProcedure,spName);
}
///<summary>
//执行非查询存储过程
//</summary>
//<paramname="spName">存储过程名称</param>
//<paramname="para">参数列表</param>
publicoverridevoidExecuteSp(StringspName,SqlParameter[]para)
{
if(spName==null)thrownewArgumentNullException("spName");
if(para==null)thrownewArgumentNullException("para");
SqlHelper.ExecuteNonQuery(_connectionString,CommandType.StoredProcedure,spName,para);
}
///执行非查询存储过程
//</summary>
//<paramname="trans">事务对象</param>
//<paramname="spName">存储过程名称</param>
//<paramname="para">参数列表</param>
publicoverridevoidExecuteSp(SqlTransactiontrans,StringspName,SqlParameter[]para)
{
if(trans==null)thrownewArgumentNullException("trans");
if(spName==null)thrownewArgumentNullException("spName");
if(para==null)thrownewArgumentNullException("para");
SqlHelper.ExecuteNonQuery(trans,CommandType.StoredProcedure,
spName,para);
}
///<summary>
//执行查询存储过程获取Reader对象
//</summary>
//<paramname="spName">存储过程名称</param>
//<returns>返回DataReader</returns>
publicoverrideIDataReaderGetReaderBySp(StringspName)
{
if(spName==null)thrownewArgumentNullException("spName");
returnSqlHelper.ExecuteReader(_connectionString,
CommandType.StoredProcedure,spName);
}
///<summary>
//执行查询存储过程获取Reader对象
//</summary>
//<paramname="spName">存储过程名称</param>
//<paramname="para">参数列表</param>
//<returns>返回DataReader</returns>
publicoverrideIDataReaderGetReaderBySp(StringspName,SqlParameter[]para)
{
returnSqlHelper.ExecuteReader(_connectionString,
CommandType.StoredProcedure,spName,para);
}
///<summary>
//执行查询存储过程获取单值
//</summary>
//<paramname="spName">存储过程名称</param>
//<returns>返回Object</returns>
publicoverrideObjectGetScalarBySp(StringspName)
{
returnSqlHelper.ExecuteScalar(_connectionString,
CommandType.StoredProcedure,spName);
}
///<summary>
//执行查询存储过程获取单值
//</summary>
//<paramname="spName">存储过程名称</param>
//<paramname="para">参数列表</param>
//<returns>返回Object</returns>
publicoverrideObjectGetScalarBySp(StringspName,SqlParameter[]para)
{
returnSqlHelper.ExecuteScalar(_connectionString,
CommandType.StoredProcedure,spName,para);
}
///<summary>
//根据存储过程获取数据集
//</summary>
//<paramname="spName">存储过程</param>
//<returns>返回数据集</returns>
publicoverrideDataSetGetDatasetBySp(StringspName)
{
if(spName==null)thrownewArgumentNullException("spName");
DataSetds=newDataSet();
SqlHelper.FillDataset(_connectionString,CommandType.StoredProcedure,spName,ds,null);
returnds;
}
///<summary>
//根据带参数的存储过程获取数据集
//</summary>
//<paramname="spName">存储过程</param>
//<paramname="para">参数列表</param>
//<returns>返回数据集</returns>
publicoverrideDataSetGetDatasetBySp(StringspName,SqlParameter[]para)
{
if(spName==null)thrownewArgumentNullException("spName");
if(para==null)thrownewArgumentNullException("para");
DataSetds=newDataSet();
SqlHelper.FillDataset(_connectionString,CommandType.StoredProcedure,spName,ds,null,para);
returnds;
}
#endregion
#endregion
}
微软本身是的SqlHelper类提供高性能可扩充的数据库访问方法,代码就不啰嗦大家都懂的,通过集成和改造对数据访问的安全性,扩展性做进一步的伸展
测试同时加载1w条数据试一试,方法执行时间,忽略浏览器加载时间
改造数据访问:
方法执行时间
企业库:
方法执行时间
普通DBHlper:
方法执行时间
同时加载10W条数据试一试:
改造后10W条数据访问时间:
企业库10W数据访问时间:
普通DBHelper,10W条数据访问时间:
当然了测试和机器配置也相关,以上数据仅供参考,不一定准确,还有很多地方不是很完善,你的项目采用的是什么数据交互模式来?有没有更好的意见和建议,期待达人们的意见和建议。
相关文章推荐
- SQL Server 2008 服务器主体 "某用户" 无法在当前安全上下文下访问数据库 "某数据库"。 (.Net SqlClient Data Provider)
- 设置androidstudio中模拟器数据库导出和Data访问权限
- SpringBoot第二讲 利用Spring Data JPA实现数据库的访问(一)
- 数据库访问公共方法实现抽象类
- Asp中的MSSQL数据库访问:driver={SQL Server};与Provider = Sqloledb;的区别
- 使用IsLine FrameWork开发ASP.NET程序之三—使用DataProvider 访问数据(下)
- Asp中的MSSQL数据库访问:driver={SQL Server};与Provider = Sqloledb;的区别
- MYSQL 更改数据库data存储目录 创建用户 创建权限 设置远程访问的权限.
- Silverlight通过Wcf Data Service访问数据库之ADO.NET Entity Framework篇
- 无论是否安装Oracle Client,都能让你用Oracle Data Provider For .Net 连上数据库。
- c#访问各数据库的providerName各驱动
- c#访问各数据库的providerName各驱动
- C++ 使用oci访问数据库出现“Column: 2<DOUBLE>, datatype in operator <</>>: CHAR”
- 为什么FleaPHP使用Table Data Gateway代替Active Record提供数据库访问服务
- system.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权
- ASP.NET企业开发框架IsLine FrameWork系列之四--DataProvider 数据访问(上)
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- SpringBoot第二讲 利用Spring Data JPA实现数据库的访问(二)_分页和JpaSpecificationExecutor接口介绍
- c# sqlite 数据库加密2010-05-29 10:55用了ADO.NET 2.0 SQLite Data Provider 这样可以直接利用它来创建一个加密的sqlite数据库。
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务