`
gstarwd
  • 浏览: 1538312 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

DataReader还是DataSet?that depends

阅读更多
我应该用DataReader类还是DataSet类呢?”
经常听到有人问这个问题:“在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应用程序的重要的部件。重要的是,我们需要了解何时、在哪里可以最好的使用它们
分享到:
评论

相关推荐

    DataReader和DataSet的区别

    在设计应用程序时,需要根据具体需求来决定使用 DataReader 还是 DataSet。如果你的应用需要: 1. 在多张表之间导航。 2. 处理来自多个数据源的数据。 3. 在分布式环境中交换数据,例如通过 XML Web 服务。 4. 缓存...

    用DataReader还是DataSet?

     我经常听到有人问这个问题:“在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?”在很多文章以及新闻组的贴子中我经常看到这样的误解,即认为DataReader(SqlDataReader或OleDbDataReader的缩写)...

    DataReader、DataSet、DataAdapter和DataView使用介绍

    ADO.NET提供两个对象用于检索关系型数据并把它存储在内存中,分别是DataSet和DataReader。DataSet提供内存中关系数据的表现–包括表和次序、约束等表间的关系的完整数据集合。DataReader提供快速、只向前、只读的...

    DATASET 与 DATAREADER对象有什么区别

    在实际开发中,选择DataSet还是DataReader取决于具体需求。如果需要高效地处理大量数据且不需要离线操作,DataReader是理想选择;如果需要在内存中对数据进行复杂的操作或编辑,那么DataSet更适合。合理利用这两种...

    详细说明asp.net中datareader 和 dataset 的区别

    ***是一个用于构建动态网页的强大框架,它提供了多种数据访问技术,其中DataView、DataReader和DataSet是常用的三种数据操作对象。在本文中,我们将详细探讨DataView对象的使用场景,同时重点比较DataReader和...

    自测试卷2.doc13.DataReader对象与DataSet对象有何区别? 14.线程在C#中使用什么类表示,你在什么情况下会考虑程序中使用线程?

    1. **DataReader对象与DataSet对象的区别** - DataReader对象:它是.NET框架中用于从数据库检索数据的流式只读对象。它不存储数据,而是按需从数据库中逐行读取,这样可以减少内存使用,提高性能。但是,由于其只...

    ExcelDataReader.dll

    ExcelDataReader.DataSet.dll是这个库的一个扩展,它允许将Excel数据直接读取到DataSet对象中,这在需要使用ADO.NET的场合非常方便。DataSet是.NET Framework中一个数据容器,它可以存储多表关系数据,并提供了查询...

    ADO.NET全套资料 连接数据库 数据绑定 Command对象和DataReader对象 DataAdapter对象和DataSet对象 ADO。Net高级编程

    ADO.NET全套资料 连接数据库 数据绑定(建立和管理简单数据绑定 建立和管理复杂的数据绑定) Command对象和DataReader对象(Command,DataReader对象属性和方法 ) DataAdapter对象和DataSet对象() ADO。...

    .NET中的DataReader简介

    在 ADO.NET 中,数据可以通过两种主要方式来处理:非缓冲模式(例如 DataReader)和缓冲模式(例如 DataSet)。这两种方式分别适用于不同的场景。 #### 二、ADO.NET 的核心组件 - **DataProvider**:包括 `...

    DataSet应用

    在.NET框架中,`DataSet`是一个非常重要的组件,主要用于存储和操作数据,它是一个内存中的数据集合,可以看作是一个轻量级的数据库。在本文中,我们将深入探讨`DataSet`的应用,包括其基本概念、功能特性、使用方法...

    C#遍历DataSet中数据的几种方法总结

    在C#编程中,`DataSet`是一个非常重要的...同时,当处理的数据涉及到数据库操作时,还可以考虑使用数据适配器(`DataAdapter`)和数据读取器(`DataReader`)等更高效的方式,尤其是在需要实时查询和更新数据的情况下。

    11:ADO.NET_Command、DataReader对象和操作

    在探讨ADO.NET_Command、DataReader对象及其操作之前,我们先来...无论是进行复杂的数据操作还是高速的数据检索,Command和DataReader都能提供必要的支持,使得ADO.NET成为现代Web应用程序和数据密集型应用的理想选择。

    对于返回值为DataSet的处理

    在.NET框架中,`DataSet`是一个非常常见的数据容器对象,尤其在早期的Web应用程序和桌面应用程序开发中,它被广泛用于存储和操作数据库中的数据。`DataSet`是ADO.NET库的一部分,它允许开发者在不与数据库保持连接的...

    DataReader反射泛型实体对象

    在.NET编程环境中,`DataReader`是用于从数据库检索数据的一种高效工具,而反射则是一种强大的技术,用于在运行时检查和操作类型。泛型则增强了代码的类型安全性和重用性。结合这三者,我们可以创建一个通用的方法,...

    使用DataReader对象读取数据

    在处理大量数据时,`DataReader`比`DataSet`或`DataTable`更高效,因为它不将所有数据加载到内存中,而是按需读取。但是,由于它不支持数据的修改,所以在需要对数据进行修改的场景下,可能需要使用`DataAdapter`和`...

    DataSet用法详解

    与`DataReader`不同,`DataSet`不仅提供了对数据的读取能力,还允许进行更新、删除等操作,并且可以在不连接数据库的情况下处理这些数据。这使得`DataSet`非常适合于多层应用程序中,在客户端和服务器端之间传递数据...

    Visual Studio 2005示例_5

    在"101个微软提供的Visual Studio 2005示例 之 Data Access_2"中,我们可以深入探讨四个关键知识点:DataSet和DataTable的增强、异步查询、SQL Server 2005中的用户自定义类型创建与使用,以及DataReader与DataSet的...

Global site tag (gtag.js) - Google Analytics