当前位置: 首页 > 编程日记 > 正文

用DataReader还是DataSet?

作者: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同他联系。

相关文章:

张钹院士:探索第三代人工智能,需要勇闯无人区的人才

整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】7 月 3-4 日,由 CSDN 主办的第三届 AI 开发者大会(AI ProCon 2020)在线上举行。本次大会有超万人报名参与,参与人群覆盖 50 领域、4000 家企业。其中…

C#删除文件夹

我们知道在c#中如果一个文件夹中有内容的话,直接使用Directory.Delete(文件夹);是删不掉的,那么如何进行删除?下面这个两个方法可以帮助你。 1、采用递归的方式,先删除文件夹中的文件,然后删除空文件夹。 p…

PHPNow升级PHP版本为5.3.5的方法

在WIN上有时候需要测试一些PHP程序,又不会自行独立配置环境,那么PHPNow是非常好的选择,这篇文章主要为大家分享下如果将phpnow的php版本升级为5.3.5在WIN上有时候需要测试一些PHP程序,又不会自行独立配置环境,那么PHPN…

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言427-438条如下:

427,SNN机理性测试 SNN利用时空处理,脉冲稀疏性和较高的内部神经元带宽来最大化神经形态计算的能量效率。尽管可以在这种情况下使用常规的基于硅的技术,但最终的神经元突触电路需要多个晶体管和复杂的布局,从而限制了集成密度。论…

C#程序设计语言Version2.0简介

[翻译] lover_P 2004-01-26 ------------------------------------------------------------------------------------------------------------------------------------------------------------ 本文翻译自Microsoft官方参考材料,提供给我们的计算机科学技术网的…

腾讯布局移动应用商店 总下载量累计达40亿次

腾讯布局移动应用商店 总下载量累计达40亿次 腾讯应用中心产品总监祝涛29日在上海表示,移动互联网近年来在国内快速发展,腾讯应用中心作为国内最大的软件商店之一,截至目前总下载量已超过40亿次。 祝涛在当天由腾讯应用中心举行的一个开发者/…

iOS开源JSON解析库MJExtension

iOS中JSON与NSObject互转有两种方式:1、iOS自带类NSJSONSerialization 2、第三方开源库SBJSON、JSONKit、MJExtension。项目中一直用MJExtension来进行JSON与Model的互转,非常方便、强大,接下来介绍一下这个轻量、强大的开源库。 1、什么是MJ…

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言439-448条如下:

439,彩虹一号无人机实现人类永不落地的追求 日媒:中国亮出杀手锏 世界各国一直在研究提高飞机的续航能力 国内研制的彩虹一号无人机采用人工智能和其他高新技术,飞行高度30000米,并终于研制成功实现人类永不落地的追求。 440&a…

Asp.Net中查询域名的Whois信息

作者&#xff1a;活靶子 出处&#xff1a;AspxBoy.Com 演示http://www.aspxboy.com/whois.aspx拷贝代码请到这里 http://www.aspxboy.com/WhoisCode.htm<% Page Language"C#" %><% Import Namespace"System.Net.Sockets" %><% Import …

Python 安装 xlsx模块

为什么80%的码农都做不了架构师&#xff1f;>>> Python 安装 xlsx模块 很多时候自动化测试时测试用例是写在excel中的如何读取转换成字典是一个比较关键的问题&#xff0c;使用pip命令安装模块如下&#xff1a;pip install openpyxl 验证使用的python代码如下&…

利用WebClient和WebRequest类获得网页源代码C#

作者&#xff1a;不详 请速与本人联系 GetPageHtml.aspx<% Page language"c#" validateRequest "false" Codebehind"GetPageHtml.aspx.cs" AutoEventWireup"false" Inherits"eMeng.Exam.GetPageHtml" %><!DO…

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言449-456条如下:

449&#xff0c;IBM发布重磅产品&#xff1a;推出新的人工智能能力。IBM研发AI向用户提供自动化的运维&#xff08;生态&#xff09;服务。 IBM新任CEO Arvind Krishna5月6日在IBM举办的“Think digital”大会上说&#xff1a;IBM致力于帮助企业&#xff08;用户&#xff09;加…

POI如何使用已有Excel作为模板二三事

关于POIPOI是Apache的一个开源项目&#xff0c;起初的目标是允许用户使用java代码来对Excel进行操作&#xff0c;发展到今天POI本身支持的范围已经逐步扩展到对Microsoft Office主要产品&#xff0c;包括&#xff1a;Excel\Word\PPT\Visio的全面支持&#xff0c;目前稳定版本为…

Graphviz样例之无向图

Graphviz是一个开源软件&#xff0c;有源码&#xff0c;支持不同平台。linux系统下使用XDot程序显示dot格式的文件。 Graphviz显示图形时&#xff0c;可以选择不同的策略进行布局和布线显示图形。 Graphviz的官方网站&#xff08;点击进入&#xff09;&#xff1a;Graphviz | G…

使用command-privilege给H3C、华为设备的用户帐号授权

一、H3C设备的权限默认分为0-3这四种级别 数值越小&#xff0c;用户的级别越低 (1)访问权限0 级 : ping、tracert、telnet 等网络诊断小程序&#xff0c;不可以dis current (2)监控权限 1级: dis current、reset、可开debug这种高级系统诊断工具&#xff0c;不能进入system视图…

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言457-465条如下:

457&#xff0c;常识推理攻关进展 人工智能要变得像人一样聪明常识推理能力是必备的 机器缺乏常识推理&#xff0c;何时到了破局的时候&#xff1f;&#xff01;这是迄今为止一直困扰人工智能50多年的难题。 OpenAI于去年发布GPT—2&#xff0c;它是一个具有15亿参数的通用语…

使用 Global.asax 文件

作者&#xff1a;未知 请速与本人联系 Global.asax 文件 除了编写 UI 代码外&#xff0c;开发人员还可以将应用程序级别的逻辑和事件处理代码添加到他们的 Web 应用程序中。此代码不处理 UI 的生成&#xff0c;并且一般不为响应个别页请求而被调用。相反&#xff0c;它负…

安装hadoop下的sqoop1.99.3及配置问题全解决

2016年8月27日&#xff0c;解决sqoop先下载的是sqoop1.99.7&#xff0c;结果配置的时候&#xff0c;出现了没有server/conf目录&#xff0c;以及启动时出现无法配置错误./bin/sqoop.sh server startyqubuntu:/opt/sqoop-1.99.7$ ./bin/sqoop.sh server startSetting conf dir: …

让Asp.NET的DataGrid可排序、可选择、可分页

‘***************************************************************‘Author: 李洪根‘MAIL: lihonggen0gci-corp.com‘专栏&#xff1a; http://www.csdn.net/develop/author/netauthor/lihonggen0/‘如需引用&#xff0c;请指明出处&#xff01; CSDN论坛VB版欢迎您&#…

asp.net mvc 3 unobtrusive client side validation not working in IE

http://stackoverflow.com/questions/5909260/jquery-1-6-form-validate-not-working-in-ie7-ie8 http://stackoverflow.com/questions/7008970/asp-net-mvc-3-unobtrusive-client-side-validation-not-working-in-ie

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言477-486条如下:

477&#xff0c;国产自动驾驶操作系统首获国际认证。 华为自动驾驶操作系统&#xff08;含虚拟化机制&#xff09;己获Safety领域最高等级功能安全认证&#xff08;ISO26262ASILD&#xff09;。 这也是我国首个获得ASILD认证的操作系统内核。 自动驾驶领域已经不再是传统汽车…

TYVJ 矩阵取数 Label:高精度+dp

题目描述 帅帅经常跟同学玩一个矩阵取数游戏&#xff1a;对于一个给定的n*m的矩阵&#xff0c;矩阵中的每个元素aij均为非负整数。游戏规则如下&#xff1a; 1.每次取数时须从每行各取走一个元素&#xff0c;共n个。m次后取完矩阵所有元素&#xff1b; 2.每次取走的各个元素只能…

一个鼠标类( Using C# and Win32API)

作者&#xff1a;网际浪子 出处&#xff1a;网络 namespace ClassLibrary.Hardware { // 原创 Using C# and Win32API ( 最近我把所有的Win32API看了1遍 很是过瘾 ) public class Mouse { internal const byte SM_MOUSEPRESENT 19; internal const byte SM_CMOUSEBU…

用Python轻松搞定Excel中的20个常用操作

来源 |早起Python&#xff08;ID: zaoqi-python&#xff09;Excel与Python都是数据分析中常用的工具&#xff0c;本文将使用动态图(Excel)代码(Python)的方式来演示这两种工具是如何实现数据的读取、生成、计算、修改、统计、抽样、查找、可视化、存储等数据处理中的常用操作&a…

vb inet 一些方法

引用:http://apps.hi.baidu.com/share/detail/14791249 使用 Internet Transfer 控件 Internet Transfer 控件实现了两种广泛使用的 Internet 协议&#xff1a; 超文本传送协议&#xff08;HyperText Transfer Protocol&#xff09;(HTTP) 和文件传送协议&#xff08;File Tran…

blogs第一天

纪念一下转载于:https://www.cnblogs.com/wandezhi/p/5819780.html

技术直播:1小时突击Java工程师面试核心(限免报名)

后疫情时代&#xff0c;连程序员这个多金的职业也遭受到了一定程度的打击。从各大招聘网站和多次面试经历中&#xff0c;相信大家已经意识到&#xff0c;面试官对程序员技能体系和项目经验考核似乎更严苛了。你在面试中常常为什么苦恼呢&#xff1f;简历撰写&#xff1f;数据算…

随笔之如何实现一个线程池

为什么80%的码农都做不了架构师&#xff1f;>>> 一 缘由&#xff1a; 最近因工作问题&#xff0c;需要实现一个简单的线程池&#xff0c;满足一下要求&#xff0c; 可伸缩&#xff0c;即一旦发现线程不够用&#xff0c;则可以动态增加线程。&#xff08;至于缩减线…

url传递中文的解决方案

作者&#xff1a;xrascal 出处&#xff1a;aspxcn url传递中文的解决方案 1.设置web.config文件。&#xff08;我不喜欢设置成这样&#xff09; <system.web> ...... <globalization requestEncoding"gb2312" responseEncoding"gb2312" cult…

要哭了,模拟器键盘一直不显示

为什么80%的码农都做不了架构师&#xff1f;>>> 今天第一次遇见模拟器键盘不显示&#xff0c;导致应用对键盘的通知监听没任何卵用&#xff0c;搞了很久还是找不到原因&#xff0c;泪崩&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 最后检查到是…