您的位置:首页 > 数据库

数据访问层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

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条数据访问时间:





当然了测试和机器配置也相关,以上数据仅供参考,不一定准确,还有很多地方不是很完善,你的项目采用的是什么数据交互模式来?有没有更好的意见和建议,期待达人们的意见和建议。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐