Username: Password:

用DataReader还是DataSet?-ASP教程,数据库相关
来源:作者: 发布时间:2007-12-26 02:09:51

我经常听到有人问这个问题:“在asp.net web应用程式中我应该用datareader类还是dataset类呢?”在很多文章连同新闻组的贴子中我经常看到这样的误解,即认为datareader(sqldatareader或oledbdatareader的缩写)比dataset好。有时候我也会看到相反的说法。事实上,microsoft创建了这两个数据存取类是因为他们都是我们所需要的。每个类都有其长处和不足,您能够根据应用环境来选择用哪一个。

本文就两者的选择问题做了很清楚的讲述,能够让您在运用asp.net时,在选择datareader类或dataset类的方面得到一些指南。在基于客户端的windows form应用程式环境下,这些规则可能会改变。我在做这些讲述时,假设您已用过datareader和dataset类了,并对他们很熟悉。

运用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类有更多的功能,这就能够让您在更多的情况下运用他们。但这并不意味着您总是在用dataset类。您需要在asp.net中完成的相当大一部分的任务都属于datareader的范畴。

尽管如此,毫无疑问,从重要程度或复杂程度的角度来说,dataset类在很多asp.net web应用程式中都起着很重要的作用。您能够通过明智的缓存来最小化数据库往返,从而降低dataset类的“性能损害”。datareader和dataset都是个成功的asp.net web应用程式的重要的部件。重要的是,我们需要了解何时、在哪里能够最好的使用他们。


喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅