|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。DataSet和SqlDataReader的对照的文章和帖子网上已良多,我也看了良多先辈的漫笔.本人在口试和实践事情中也碰到如许的成绩.可是一直是没深切举行进修.比来在事情余暇之余,专程查阅了一些文章,也包含msdn的官方文档.本人创建数据库和测试程序,对DataSet和SqlDataReader做了对照.
起首关于二者对照支流的概念就是:
1.DataReader利用时一直占用SqlConnection,在线操纵数据库.DataSet则是将数据一次性加载在内存中.撑持数据库会见的断开毗连模子.
2.DataReader每次只在内存中加载一条数据,勤俭内存.DataSet将数据全体加载在内存中.对照损耗内存.
3.DataReader单向只读.DataSet撑持查询修正删除等操纵,对照天真.
4.DataReader与SqlCommand搭配.DataSet与DataAdapter分离利用.
为何会如许呢?我们就来剖析一下详细的缘故原由.检察一下msdn关于二者的分歧形貌:
1、SqlDataReader:
该类供应一种从SQLServer数据库读取行的只进流的体例。没法承继此类。定名空间:System.Data.SqlClient程序集:System.Data(在System.Data.dll中).可使用ADO.NETDataReader从数据库中检索只读、只进的数据流。查询了局在查询实行时前往,在并存储在客户真个收集缓冲区中,直到您利用DataReader的Read办法对它们收回哀求。利用DataReader能够进步使用程序的功能,缘故原由是它只需数据可用就当即检索数据,而且(默许情形下)一次只在内存中存储一行,削减了体系开支。
2、DataSet:
该工具是撑持ADO.NET的断开式、散布式数据计划的中心工具。DataSet是数据的内存驻留暗示情势,不管数据源是甚么,它城市供应分歧的干系编程模子。它能够用于多种分歧的数据源,用于XML数据,或用于办理使用程序当地的数据。DataSet暗示包含相干表、束缚和表间干系在内的全部数据集。下图将显现DataSet工具模子。
从下面的形貌能够看出,DataReader和DataSet具有分歧的布局模子.在数据的体例处置上也存在明显的不同.SqlDataReader会制止创立不用要的工具或复制不用要的数据.DataSet能够暗示完全的数据模子,包含表格、束缚前提和表干系.在工具的创立和烧毁等环节必要损耗更多的资本,因而在功能上也稍显减色.因而良多文章得出的结论也是在只举行读数据操纵的情形下,DataReader的功能要强于DataSet.可是良多文章都没有响应的测试,就自觉下结论.
可是猎奇心思的使令使我很想来做个实验来考证一下这个结论,究竟DataReader比DataSet在查询数据的时分,功能会不会胜出,假如前者更优的话那末会超越几?我本人写了个小程序,本人创建的数据库举行了实行.实行测试情况以下:
硬件:
CPU
IntelT23001.66GHz内存
KingstonDDR26671G硬盘
80G5400转8m
软件:
操纵体系
WindowsServer2003数据库体系
SQLServer2005Enterprise数据范围
1000000条数据
数据库表布局
Test
称号
范例备注
idint标记会萃索引name
nvarchar(50)
非会萃索引birthday
datetime
诞辰height
int
身高sex
int
性别address
nvarchar(100)
地点lastlogintime
datetime
非会萃索引
详细的实行程序c#代码以下,利用了usingSystem.Data.SqlClient;usingSystem.Diagnostics;两个namespace下的类,Stopwatch工具用来举行计时.
测试DataSet的代码:
using(SqlConnectionconn=newSqlConnection("DataSource=127.0.0.1;InitialCatalog=Test;IntegratedSecurity=True"))
{
Stopwatchst=newStopwatch();
st.Start();
conn.Open();
SqlDataAdapterda=newSqlDataAdapter(sQuery,conn);
st.Stop();
st.Start();
DataSetds=newDataSet("test");
da.Fill(ds);
st.Stop();
longltimes=st.ElapsedMilliseconds;
conn.Close();
}
测试DataReader的代码:
using(SqlConnectionconn=newSqlConnection("DataSource=127.0.0.1;InitialCatalog=Test;IntegratedSecurity=True"))
{
Stopwatchst=newStopwatch();
st.Start();
conn.Open();
SqlCommandComm=newSqlCommand(sQuery,conn);
st.Stop();
textBox4.Text=st.ElapsedMilliseconds.ToString();
st.Start();
SqlDataReaderreader=Comm.ExecuteReader();
while(reader.Read())
{
}
st.Stop();
longltimes=st.ElapsedMilliseconds;
textBox2.Text=ltimes.ToString();
conn.Close();
}
测试语句和工夫ms分离以下:
语句
DataSet费时
DataReader费时
stringsQuery="SELECT*FROMdbo.testwhereid<=1"
0ms0msstringsQuery="SELECT*FROMdbo.testwhereid<=10"
1ms1msstringsQuery="SELECT*FROMdbo.testwhereid<=100"
2ms3msstringsQuery="SELECT*FROMdbo.testwhereid<=1000"
5ms6msstringsQuery="SELECT*FROMdbo.testwhereid<=10000"
8ms50ms从实验了局剖析能够得出以下结论:
1.在查询数据量很少的情形下100条内,DataReader和DataSet几近没有甚么分明的功能不同.
2.数据量过年夜,靠近10000条的时分的数据查询,DataReader的功能要分明优于DataSet.
关于二者的功能对照,不该该容易下结论,除参考实行设备,也要思索实践的数据范围.
详细项目使用中,选择合适详细需求的工具举行数据处置,才干无效的进步体系的功能.
本文的测试情况和了局大概存在偏向,可是但愿能给人人带来一些匡助,一同交换进修.感谢.
我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。 |
|