datareader和dataset的异同
发布网友
发布时间:2022-04-11 00:53
我来回答
共2个回答
懂视网
时间:2022-04-11 05:15
strConnect = "Data Source=localhost;Initial Catalog=cmsw;Integrated Security=True; Application Name=pgq";
DataSet dsCode = new DataSet();
using (SqlConnection sqlConn = new SqlConnection(strConnect))
{
sqlConn.Open();
SqlDataAdapter sda = new SqlDataAdapter("SELECT top 200000 TRANCODE from JobRecord ", sqlConn);
sda.Fill(dsCode, "Test");
sqlConn.Close();
}
DateTime dt1 = DateTime.Now;
foreach (DataRow dr in dsCode.Tables[0].Rows)
{
using (SqlConnection sqlConn = new SqlConnection(strConnect))
{
string code = dr["TRANCODE"].ToString();
SqlCommand cmd = new SqlCommand("SELECT * from JobRecord WHERE TRANCODE=@TRANCODE ", sqlConn);
cmd.Parameters.AddWithValue("TRANCODE", code);
sqlConn.Open();
SqlDataReader dataRead = cmd.ExecuteReader();
if (dataRead.Read())
{
Console.WriteLine("One Cycle:{0}",dataRead["TRANCODE"]);
}
sqlConn.Close();
}
}
DateTime dt2 = DateTime.Now;
TimeSpan ts1 = dt2 - dt1;
Console.Clear();
Console.WriteLine("Total MilSeconds:{0}", ts1.Milliseconds);
DataSet dsTest2 = new DataSet();
using (SqlConnection sqlConn = new SqlConnection(strConnect))
{
sqlConn.Open();
SqlDataAdapter sda = new SqlDataAdapter("SELECT top 200000 * from JobRecord ", sqlConn);
sda.Fill(dsTest2, "dsTest2");
sqlConn.Close();
}
int serialNo = 0;
while (serialNo < 200000)
{
Random rand = new Random();
int index = rand.Next(1, 200000);
var code = dsTest2.Tables[0].AsEnumerable()
.Where(r => r.Field<string>("TRANCODE") == dsCode.Tables[0].Rows[index]["TRANCODE"].ToString())
.Select(r => r.Field<string>("TRANCODE")).ElementAtOrDefault(0);
Console.WriteLine("Scend Cycle:{0}",code);
serialNo++;
}
DateTime dt3 = DateTime.Now;
TimeSpan ts2 = dt3 - dt2;
Console.WriteLine("First Result, TotalSeconds:{0};
Second Result TotalSeconds:{1}", ts1.TotalSeconds, ts2.TotalSeconds);
Console.ReadLine();
将数据一次性加载到DataSet与逐行从DB内读取的性能比较
标签:校验 apt next select reac init nec 方式 value
热心网友
时间:2022-04-11 02:23
第一种解释
DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection(俗称:非断开式连接),在线操作数据库时,任何对SqlConnection的操作都会引发DataReader的异常。因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的。由于DataReader的特殊性和高性能,所以DataReader是只进的,你读了第一条后就不能再去读取第一条了。
DataSet则是将数据一次性加载在内存中,抛弃数据库连接(俗称:断开式连接)。读取完毕即放弃数据库连接,因为DataSet将数据全部加载在内存中,所以比较消耗内存。但是确比DataReader要灵活,可以动态的添加行,列,数据,对数据库进行回传,更新操作等。
第二种解释
使用DataReader与DataSet都可以从数据源读取数据。DataReader本身是通过IDbCommand.ExecuteReader()方法进行构建的;而DataSet则是通过DbDataAdapter.Fill()方法进行填充。此外,两者的工作方式有明显的不同:DataReader的执行过程不能脱离数据库连接,也就是在DataReader读取数据的时候不能够使用IDbConnection.Close()方法关闭数据库连接;而在使用DataSet获取数据时,可以断开数据库的连接,因为此时DbDataAdapter已经负责将数据获取到应用服务器中了。
由于有这样的区别,所以在开发数据库相关程序时需要特别注意。例如在使用DataReader获取数据后,应该主动地关闭数据库连接,否则可能出现数据库连接池溢出的异常。
第三种解释
可以使用DataReader类的对象或DataSet类的对象从数据库读取数据,但它们是有区别的,归纳起来大致有以下几条:
1. DataReader是数据管理提供者类,而DataSet是一般性数据类。
2. DataSet获取数据需要通过桥梁DataAdapter的填充,由于DataReader本身就是管理提供者,它可以通过Command的ExecuteReader()方法就可以获取数据。
3. DataReader是在线处理,当连接关闭后就不能读取数据;DataSet可以离线处理数据,它是把数据从数据库拷贝到本地存储,在关闭连接的情况下仍然可以在DataSet中处理数据,甚至可以在本地存储的表格中增加*。
4. DataReader只能正向读取数据,但不能修改数据;DataSet可以按任何顺序读行,可以按灵活的方式搜索、排序和过滤这些行,甚至可以改变这些行,然后将这些改变同步到数据库中。
5. 从DataReader读取数据的速度快于DataSet。
6. 由于DataSet是离线处理,所以当在事务处理中要锁定数据库时,不可以使用DataSet。因为当DataSet被填充以后,会自动断开与数据库的连接,此时不可能再对数据库进行锁定。
可以看出,在通常情况下,DataSet与 DataReader可能可以相互代替,当有特定要求时却需要仔细分析,到底使用哪种方式更合适。
DataReader与DataSet最根本的区别就在于一个是在线处理,另一个是离线处理。在线时,得到的是数据库当前的真实数据,但总是在线的话,增加了网络的通讯负担。离线后数据拷贝在本地,可以减轻网络负担,程序处理数据更加方便,若离线时间过长,看到的数据就不一定是真实的数据了。
补充经验:大数据量上使用DataSet和DataReader混用,当单表数据量很大时,使用DataSet是一种很不明智的选择,因为DataSet是以DataTable内存形式存放数据,一次性将很大数据放入内存,这是非常吃内存的。相比DataSet,DataReader就显得优雅很多,它是每次只读取一条数据,然后循环调用机制。但它也有弊端,就是相对非断开连接,但是对内存消耗而言这是有利的。DataSet在大部分应用场景下也是有自己优点的,比如充分解耦、一次操作、领域模型操作等。
所以要根据不同场景合理使用这两种对象。
datareader和dataset的异同
1. DataReader是数据管理提供者类,而DataSet是一般性数据类。2. DataSet获取数据需要通过桥梁DataAdapter的填充,由于DataReader本身就是管理提供者,它可以通过Command的ExecuteReader()方法就可以获取数据。3. DataReader是在线处理,当连接关闭后就不能读取数据;DataSet可以离线处理数据,它是把数...
DataReader和DataSet的异同
DataSet在 IIS 服务器上所使用的内存较多。DataReader在 IIS 服务器上所使用的内存较少。综上所述得出DataSet和DataReader有各自适用的场合。如果数据来源控件只是用来填入控件的清单成为其选项,或者数据绑定控件并不需要提供排序或分页功能的话,则应该使用 DataReader。反之,如果数据绑定控件需要提供排序或...
C#之 DataReader 和 DataSet 的区别
DataSet是一数据存储的类,你可以把数据库中的数据读取到内存中,在内存中按照DataSet这种格式进行数据的统计。而DataReader是一种读取数据的方式,也可以认为是内存中数据与数据库中数据的一种桥梁,例如,我们可以通过DataReader把数据库中数据读到内存表中(DataSet)中。而DataReader与DataAdapter是有可比...
C#中IDataReader和DataSet的区别是什么呢?
datareader和dataset最大的区别在于,datareader使用时始终占用sqlconnection,在线操作数据库..任何对sqlconnection的操作都会引发datareader的异常..因为datareader每次只在内存中加载一条数据,所以占用的内存是很小的..因为datareader的特殊性和高性能.所以datareader是只是向前读的 读了第一条后就不能再去...
c# DataReader和用DataAdapter来填充DataSet 两者的效率的区别有多大...
表面上看 DataReader 要比 DataSet效率高.因为DataReader是在线读取,也就是说在DataReader 读取数据期间,客户端和数据库之间始终保持一个连接,一次只读一条数据;而DataSet从数据库中读取一堆数据 到 客户端后就可以断开和数据库的连接了.用 DataReader 会使数据库服务器的压力增大,会降低数据库服务器...
C#中IDataReader和DataSet的区别是什么呢?
用connection对象和command对象与数据库连接并交互后,有两种方法来访问获取的结果。1.使用DataReader对象,用来逐行从数据源获取数据并处理;2.使用DataSet对象,用来将数据存到内存中进行处理。
SqlDataRead和Dataset的区别
Dataset是把数据读出,缓存在内存中。缺点:对内存的占用较高。如果对返回的数据需做大量的处理用Dataset比较好些可以减少对数据库的连接操作。优点:只需连接一次就可close于数据库的连接 一般情况下,读取大量数据,对返回数据不做大量处理用SqlDataReader.对返回数据大量处理用datset比较合适.对SqlData...
c# 中 sqldatareader 和 sqldataadapter 、dateset的比较
上面两种方案中,比较如下:1.性能。DataSet中的数据完全保存在内存中,所以会占用内存。但是通常情况下DataReader读出的数据实例化以后也是在内存中的,所以两者没有多大区别。但是,当数据量极大的情况下,使用DataSet时,不论是你分页还是不分页,它的效率之低,和SqlDataReader相比都是不可同日而语的,...
用SqlDataReader和SqlDataAdapter读取数据有啥区别?
这个是这样的,SqlDataReader只能用于读,在读的过程中数据库一直保持打开状态,不过读的效率还是可以的 SqlDataAdapter(数据适配器)、DataSet 先将数据取出来放到dataset中,然后就可以关闭数据库了,通过sqldataadapter还可以更新删除数据库中的东西,功能很强大,要好好学习。像绑定某些数据源之类的话强烈...
ASP.NET如何进行性能优化问题
Dataset是把数据读出 缓存在内存中 缺点 对内存的占用较高 如果对返回的数据需做大量的处理用Dataset比较好些可以减少对数据库的连接操作 优点 只需连接一次就可close于数据库的连接 *一般情况下 读取大量数据 对返回数据不做大量处理用SqlDataReader 对返回数据大量处理用datset比较合适 对SqlDataReader和Dataset的选...