作者:Jonathan Goodyear        出处:网络

我经常听到有人问这个问题:“在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应用程序的重要的部件。重要的是,我们需要了解何时、在哪里可以最好的使用它们。

关于作者:

Jonathan Goodyear是ASPSoft的总裁,这是个位于Orlando,Fla.的一家Internet咨询公司。他是位MCSD,是Debugging ASP.NET(New Riders)一书的作者。你可以通过jon@aspsoft.com与他联系,或者通过他在www.angryCoder.com上的angryCoder eZine同他联系。

用DataReader还是DataSet?相关推荐

  1. DataReader和DataSet区别

    第一种解释 DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库..任何对SqlConnection的操作都会引发DataR ...

  2. 使用DataReader、DataSet、DataAdapter和DataView

    使用DataReader.DataSet.DataAdapter和DataView ADO.NET提供两个对象用于检索关系型数据并把它存储在内存中,分别是DataSet和DataReader.Data ...

  3. asp.net中读取数据库中的数据可以使用DataReader和DataSet 2种方式(初学者望大家不要笑我)...

    在asp.net中,读取数据库中的数据可以使用DataReader和DataSet 2种方式, 两者的差异如下:     使用Dataset对象读取数据大致需要以下5个步骤:     (1)建立数据库 ...

  4. DataReader与DataSet,DataGrid与DataList等相关知识

    DataReader与DataSet有什么区别? DataSet表示一个数据集,是数据在内存中的缓存. 可以包括多个表 DataSet 连接数据库时是非面向连接的.把表全部读到Sql中的缓冲池,并断开 ...

  5. DataReader与DataSet,DataGrid与DataList

    DataReader与DataSet有什么区别? DataSet表示一个数据集,是数据在内存中的缓存. 可以包括多个表 DataSet 连接数据库时是非面向连接的.把表全部读到Sql中的缓冲池,并断开 ...

  6. mysql datareader dataset_c# 将数据库返回对象DataReader转换为DataSet的方法分享

    摘要: 下文讲述c#中将对象DataReader转换为DataSet的方法分享,如下所示: 例: 编写一个DataReader转换为DataSet方法 ---编写getDataSet方法 public ...

  7. DataReader和DataSet的异同

    DataReader 使用时始终占用 SqlConnection,在线操作数据库 每次只在内存中加载一条数据,所以占用的内存是很小的 是只进的. 只读的 DataSet 则是将数据一次性加载在内存中. ...

  8. mysql datareader dataset_C# 之 DataReader 和 DataSet 的区别

    //未式关闭连接 public SysFunction GetModelById(stringid) { SqlConnection conn= new SqlConnection(Configura ...

  9. ASP.NET 2.0 - 选用DataSet或DataReader

    我们在之前的一篇文章提到如何善用「善用 DataSourceMode 属性」(http://www.cnblogs.com/liminzhang/archive/2006/12/18/595332.h ...

最新文章

  1. 射频放大器芯片3阶截点计算与芯片选择
  2. python直方图均衡函数_Python中的自适应直方图均衡
  3. 汇编语言——基础知识
  4. Hibernate初探(二)
  5. 15岁大学毕业,一生800多篇专著论文,双眼失明却凭一条公式称霸数学界
  6. 工作六年 我终于学会了这项技能 可惜晚了!!!
  7. 3d建模电脑配置要求_建模你会一个软zbrush够吃一辈子,你学会了吗?
  8. Unity中使用GameObject.Find、Transform.Find查找GameObject
  9. 使用自定义手势处理器-陈鹏
  10. PowerDesigner 生成数据字典
  11. 窥探PTAM之Mapping线程
  12. Git分支管理Git branch相关参数命令,git branch -v git branch --merged git branch --no-merged git commit -a -m
  13. html毕业设计任务要求,毕业设计任务及进度安排|毕业设计进度安排
  14. VMware Horizon 8 2106 -- 用于管理虚拟桌面 (VDI)、应用和在线服务的领先平台
  15. 【U盘主控芯片的优缺点】
  16. fstream的使用详解
  17. cpu上干硅脂怎么清理_安装CPU或者清理灰尘时CPU导热硅脂的使用方法及注意事项...
  18. PAL到底是720还是768?
  19. Android之电话拦截
  20. 百度百科:资金管理---现金为王

热门文章

  1. kali linux安装wine32,永恒之蓝msf下 ms17_010 (64位kali下安装wine32)
  2. php点号的意思,[PHP] - 逗号和点号的区别
  3. 人工智能入门:keras的example文件解析
  4. 为什么我的python程序编译器没有行代号_为什么我的python字典没有附加新变量呢?...
  5. perl 如何更新_Perl 进度条模块
  6. layui 表格内容写temple函数_layui 表格内容显示更改
  7. PCL点云特征描述与提取(2)
  8. 解决360浏览器偶发性会闪屏一下黑色的背景
  9. 一道题弄明白二维数组的指针
  10. Photoshop创造氛围照片合成视频教程含素材