请问各位dataset 同datareader的主要区别在什么地方?

vinjian 2003-12-12 01:26:18
在开发中如何去选取他们呢
...全文
32 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
vinjian 2003-12-12
谢谢大家!
  • 打赏
  • 举报
回复
uno 2003-12-12
两者是不同层次的东西

DataReader类似客户端的游标(是对于数据库服务器来说的客户端)

DataSet是存放数据结果的东西,一般和DataAdapter配合使用

通过DataReader把数据库服务器的结果取出,你也可以将取出后的数据放入DataSet
  • 打赏
  • 举报
回复
houlinghouling 2003-12-12
当有检索大量的数据时,保持内存开放的问题变成了一个因素。例如,从一个数据库中读取1万行数据将引起一个数据表为这1万行数据分配,并在该数据表的生存期内保留内存空间。如果有1千个用户同时在同一台机器上做这样的检索操作,那么存储空间的使用将变得非常紧急。
同样,如果用户对给定查询的结果不能确定,则需要编码重复进行,那样一个数据表就不够了,将需要加载整个数据流。
为了解决这个问题,DataReader是一个只读的、只能转发的、从数据库返回的数据流。任何时候一次只能有一个记录位于内存中。
DataReader是一个只能转发的、只读的、位于从数据存储返回的数据流顶部的存取器。用户可以以非常简单的格式遍历返回的数据阅读者(datareader):


一个DataSet(数据集)对象是指一个内存中的数据缓存。它包含一个表和这些表之间关系的知识的集合。每个表包含一个列集合。这些对象代表了数据集的模式。每个表都有多个行,表示这个数据集所保持的数据。这些行记得它们的初始状态和当前状态,以便数据集可以跟踪发生了何种改变。此外,DataSet(数据集)通过XML提供了保持(persistance)和不再保持(de-persistance)。
DataSet(数据集)可以被认为是ADO+的中心,同时它代表了一组完整的数据,包括多个相关表和约束。当在一个企业解决方案的不同组件间传递数据时,DataSet提供了一个丰富的对象模型。例如,在代表性的解决方案中,一个客户应用程序通过URL请求数据。当请求到达适当的中间层组件时,将使用适配器创建一个数据集。然后这个数据集被转换为一个XML文档,传送回请求者。在客户应用程序上,使用控件组合来显示这些数据,如DataGrid(数据网格)。用户可以对数据进行操作—添加、删除和编辑—直到自己满意。当准备完毕时,数据集再一次被转换为XML文档,传送回服务器组件。该组件将XML文档转化为数据集,然后使用适配器将改变的数据合并回DBMS中。如果发生任何冲突,服务器组件可以使用内置的商务规则对它们进行调整。经过调整的数据集然后被返回客户。数据集然后可以被合并到现有的数据集中,用户可以重新开始使用反映最新版本的数据集工作。

  • 打赏
  • 举报
回复
Lostinet 2003-12-12
你可以认为DataReader是ADODB中只读只前进的RecordSet
而DataSet则可以认为是非常高级的数组。
  • 打赏
  • 举报
回复
flyinglz 2003-12-12
DataSet是一个离线数据库,数据取出后与真实数据库完全脱开.它可以维护它里面的DataTable的关系.

DataReader是一种数据读取方式.类似于asp中使用的数据库读取方式,它在读取数据库时将不会断开与数据库的连接.直到使用完毕.
  • 打赏
  • 举报
回复
lbzq 2003-12-12
运用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数据写回一个数据流或一个文件。
  • 打赏
  • 举报
回复
相关推荐
发帖
.NET社区
加入

6.0w+

社区成员

.NET技术交流专区
帖子事件
创建了帖子
2003-12-12 01:26
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。