使用DataReader还是DataSet?

2016-01-29 13:30 6 1 收藏

使用DataReader还是DataSet?,使用DataReader还是DataSet?

【 tulaoshi.com - ASP.NET 】

    经常听到有人问这个问题:“在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?”在很多文章以及新闻组的贴子中我经常看到这样的误解,即认为DataReader(SqlDataReader或OleDbDataReader的缩写)比DataSet好。有时候我也会看到相反的说法。事实上,Microsoft创建了这两个数据存取类是因为它们都是我们所需要的。每个类都有其优点和不足,你可以根据应用环境来选择用哪一个。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

    本文就两者的选择问题做了很清楚的讲述,可以让你在运用ASP.NET时,在选择DataReader类或DataSet类的方面得到一些指南。在基于客户端的Windows Form应用程序环境下,这些规则可能会改变。我在做这些讲述时,假设你已经用过DataReader和DataSet类了,并对它们很熟悉。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

运用DataReader类
    下面就是运用DataReader类的理想条件: 你读取的数据必须是新的,所以在每次需要数据的时候,你都必须从数据库读取。创建一个DataReader类不会消耗很多内存,不过随着负荷的增加,DataSet上的性能也会很快地提高(参考资源中Visual Studio Magazine中的文章)。
    你对每行数据的需求很简单。该情况的最好的例子就是简单地将DataReader绑定到一个Web控件,如DataGrid或DropDownList。
你只需要从数据库中以只向前的(forward-only) 、只读的形式来存取XML数据。在这种情况下,你可以用SQLCommand对象的ExcecuteXmlReader()方法来得到一个XmlReader类(相当于XML版的DataReader)。这就需要一个运用FOR XML子句的SQL Server查询,或者一个包含有效XML的ntext字段。
    你计划对数据库进行几个重复的调用,来读取一小块信息。在这种情况下,我们前面提到过的性能数据会有更大的提高。
的确,使DataSet类更强大的许多功能只适用于基于客户端的Windows Form应用程序,比如在多个表之间建立关系的功能。在很多情况下,DataSet类都比DataReader类更有优势,而且在有些情况下,你根本就不能用DataReader类。

运用DataSet类
    在下面的情况,你应该考虑运用DataSet类: 你构建了一个Web service,它运用的数据是你作为返回值读取的数据。因为DataReader类必须保持到数据库的连接,所以它们不能被序列化到XML中,也不能被发送给一个Web service的调用者。
你需要排序或筛选数据。在运用一个DataView对象(呈现为DataTable类的DefaultView属性,它包含一个DataSet类)来排序或筛选数据前,我们先试着用SQL查询(如WHERE和ORDER BY语句)来实现这些功能,并运用更轻量级、更快的DataReader类。然而,有时侯用这种方法是不行的,或者当你需要多次地对数据进行排序或筛选时就不能用DataReader。
针对同一请求,你需要多次遍历数据。你只能在DataReader中循环一次。如果你想将多个ServerControl类绑定到同一个数据集,那么选择DataSet就更好。DataReader类不能被绑定到多个ServerControl类,因为它是只向前读取的。在这种情况下,如果要使用DataReader,必须从数据库读取两次数据。
    你需要存储数据,而后续的页面请求可能会用到的这些数据。如果数据只被请求它的专门的人使用,你可以将DataSet类保存在一个Session变量中。如果数据可以被任何人访问,那么你可以将它保存在一个Application变量中,或保存在Cache中(我建议使用后一种方法,因为它支持时间期限和回调(callback))。因为DataReader类必须一直打开对数据库的连接,而且它一次只能保存一行数据,所以它们不能在跨页面请求中被保存。
    你需要对一个结果集的每个元素实现特殊的、耗时的功能。例如,如果你从一个数据库读取一列邮政编码,并想通过调用一个Web service来得到每个地区的详细的天气状况信息,那么选择DataSet就会更好。这是因为,当你在用DataReader类时,在关闭DataReader类前,与数据库的连接不会被释放回连接池。在数千页面请求之间潜在的一个很小的延时都会造成Web应用程序的很高的访问量,从而就会消耗完可用的连接。相反,DataSet可以在前端读取所有的数据,并可以马上关闭与数据库的连接,将它返回到连接池,因此其它的页面请求就可以用这个连接了。
    你需要在一个两维范例中加载并处理XML数据。DataSet类对于XML很有用,因为你可以将DataView用于XML,对根本的数据进行排序和筛选,就同处理一个数据库结果集一样。然而,需要注意的是在System.Xml名字空间中有很多类,你可以将它们用于更复杂的XML操作。
    你的数据源不是一个数据库。虽然OleDbDataReader可以用于任何OLEDB数据提供者(可能指向一个数据库,也可能不指向一个数据库),但DataSet对象可以从一个XML文件直接加载数据,并动态地解释它的schema。DataSet类也可以将XML数据写回一个数据流或一个文件。

    从上面的讲述我们就可以看到,DataSet类比DataReader类有更多的功能,这就可以让你在更多的情况

来源:https://www.tulaoshi.com/n/20160129/1490430.html

延伸阅读
标签: ASP
  ADO+引入了DataSet和DataView的概念。DataSet类似于记录集的集合,因为它能保存一个或多个数据及其之间关系的表(table)。DataView是这些表中之一的实现,类似于ADO 记录集。在上面的例子中,我们的DataSet只保存一个表:Upcoming,我们要将之驻留于ASP+服务器控件中。可以通过以下方式向DataSet中加入更多表。 *重新定义...
进入DataSet 作 者 : 雨晨 ADO+引入了DataSet和DataView的概念。DataSet类似于记录集的集合,因为它能保存一个或多个数据及其之间关系的表(table)。DataView是这些表中之一的实现,类似于ADO 记录集。在上面的例子中,我们的DataSet只保存一个表:Upcoming,我们要将之驻留于ASP+服务器控件中。可以通过以下方式向DataSet中加入更多...
标签: 牙线 牙线使用
如何使用牙线 1.吃了塞牙的饭后:有效清洁牙齿间食物残渣,解决塞牙的不适感。 2.晚上刷牙后:清除食物残渣、软牙垢、牙菌斑,预防牙齿疾病。 3.拿出带棒牙线,手捏细棒,照着镜子。把细线摩擦进去一个牙缝,直到牙龈,但不要用力过大。先清洁牙缝的其中一面。上下左右缓慢摩擦,牙线要与牙面成”C“字型,才能清洁面更大。然后同样手法清洁...
标签: 月经
摘要: 消毒湿巾,听起来好像方便又卫生,尤其是一些女性专用的私处护理湿巾,用它来代替日常清洗,受到众多女性的青睐。但是,你知道吗,常用护理湿巾清洁私处,可能会破坏私处的酸碱平衡,尤其是一些含有药物成分的护理湿巾,不但不能杀灭病菌,频繁使用还会引发妇科疾病。 &...
导 读:在ADO中我们最常使用的对象就Recordset了,而在ADO.NET中又增加了一个对象DataSet。本文简要的对比了DateSet和Recordset的异同,这对ADO.NET的初学者非常有帮助! 翻译整理:.net技术网(www.51dotnet.com)郜飞 原文出处:http://www.database-applications.net/articles/dotnet4.html Recordset是一个连接或断开的(通过使用游标)...

经验教程

150

收藏

8
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部