使用DataReader还是DataSet?

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

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

 

运用datareader类
    下面就是运用datareader类的最佳条件:

    1.你读取的数据必须是新的,所以在每次需要数据的时候,你都必须从数据库读取。创建一个datareader类不会消耗非常多内存,不过随着负荷的增加,dataset上的性能也会非常快地提高(参考资源中visual studio magazine中的文章)。
    2.你对每行数据的需求非常简单。该情况的最佳的例子就是简单地将datareader绑定到一个web控件,如datagrid或dropdownlist。 你只需要从数据库中以只向前的(forward-only) 、只读的形式来存取xml数据。在这种情况下,你能用sqlcommand对象的excecutexmlreader()方法来得到一个xmlreader类(相当于xml版的datareader)。这就需要一个运用for xml子句的sql server查询,或一个包含有效xml的ntext字段。
    3.你计划对数据库进行几个重复的调用,来读取一小块信息。在这种情况下,我们前面提到过的性能数据会有更大的提高。
    的确,使dataset类更强大的许多功能只适用于基于客户端的windows form应用程式,比如在多个表之间建立关系的功能。在非常多情况下,dataset类都比datareader类更有优势,而且在有些情况下,你根本就不能用datareader类。

运用dataset类
    在下面的情况,你应该考虑运用dataset类:

    1.你构建了一个web service,他运用的数据是你作为返回值读取的数据。因为datareader类必须保持到数据库的连接,所以他们不能被序列化到xml中,也不能被发送给一个web service的调用者。
    2.你需要排序或筛选数据。在运用一个dataview对象(呈现为datatable类的defaultview属性,他包含一个dataset类)来排序或筛选数据前,我们先试着用sql查询(如where和order by语句)来实现这些功能,并运用更轻量级、更快的datareader类。然而,有时侯用这种方法是不行的,或当你需要多次地对数据进行排序或筛选时就不能用datareader。
    3.针对同一请求,你需要多次遍历数据。你只能在datareader中循环一次。如果你想将多个servercontrol类绑定到同一个数据集,那么选择dataset就更好。datareader类不能被绑定到多个servercontrol类,因为他是只向前读取的。在这种情况下,如果要使用datareader,必须从数据库读取两次数据。
    4.你需要存储数据,而后续的页面请求可能会用到的这些数据。如果数据只被请求他的专门的人使用,你能将dataset类保存在一个session变量中。如果数据能被所有人访问,那么你能将他保存在一个application变量中,或保存在cache中(我建议使用后一种方法,因为他支持时间期限和回调(callback))。因为datareader类必须一直打开对数据库的连接,而且他一次只能保存一行数据,所以他们不能在跨页面请求中被保存。
    5.你需要对一个结果集的每个元素实现特别的、耗时的功能。例如,如果你从一个数据库读取一列邮政编码,并想通过调用一个web service来得到每个地区的周详的天气状况信息,那么选择dataset就会更好。这是因为,当你在用datareader类时,在关闭datareader类前,和数据库的连接不会被释放回连接池。在数千页面请求之间潜在的一个非常小的延时都会造成web应用程式的非常高的访问量,从而就会消耗完可用的连接。相反,dataset能在前端读取所有的数据,并能马上关闭和数据库的连接,将他返回到连接池,因此其他的页面请求就能用这个连接了。
    6.你需要在一个两维范例中加载并处理xml数据。dataset类对于xml非常有用,因为你能将dataview用于xml,对根本的数据进行排序和筛选,就同处理一个数据库结果集相同。然而,需要注意的是在system.xml名字空间中有非常多类,你能将他们用于更复杂的xml操作。
    7.你的数据源不是个数据库。虽然oledbdatareader能用于所有oledb数据提供者(可能指向一个数据库,也可能不指向一个数据库),但dataset对象能从一个xml文件直接加载数据,并动态地解释他的schema。dataset类也能将xml数据写回一个数据流或一个文件。

    从上面的讲述我们就能看到,dataset类比datareader类有更多的功能,这就能让你在更多的情况下运用他们。但这并不意味着你总是在用dataset类。你需要在asp.net中完成的相当大一部分的任务都属于datareader的范畴。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值