DataSet和DataReader之间的比较

      通过学习,自己对.NET的框架的提供程序也有了深刻的认识,下面和大家分享下自己的看法和见解!

       对于 DataSet 和 DataReader 之间的比较,以及这些对象中每个对象最佳用法的用法似乎对于初学者还不是那么的清楚,那么就从这里开始吧!

      ADO.NET 提供以下两个对象,用于检索关系数据并将其存储在内存中:DataSet 和 DataReader。

      DataSet 提供一个内存中数据的关系表示形式,一整套包括一些表在内的数据(这些表包含数据、对数据进行排序并约束数据),以及表之间的关系。而DataReader 提供一个来自数据库的快速、只进、只读数据流。
当使用 DataSet 时,经常会利用 DataAdapter与数据源进行交互;当使用 DataSet 时,也可以利用 DataView 对 DataSet 中的数据应用排序和筛选;也可以从 DataSet 继承,创建强类型 DataSet,用于将表、行和列作为强类型对象属性公开。 


      何时使用 DataSet 或 DataReader ?  
当设计应用程序时,你必须知道此应用程序所需功能的等级,这样才能很确定使用是使用 DataSet 或者是 DataReader。
要通过应用程序执行以下操作,这时就要使用 DataSet: 
     a、在结果的多个离散表之间进行导航。 
     b、 数据源来自不唯一(例如,来自多个数据库、一个 XML 文件和一个电子表格的混合数据)的数据。 
     c、 在各层之间交换数据或使用 XML Web 服务。与 DataReader 不同的是,DataSet 能传递给远程客户端。 
     d、重用同样的行组,以便通过缓存获得性能改善(例如排序、搜索或筛选数据)。 
     e、每行执行大量处理。对使用 DataReader 返回的每一行进行扩展处理会延长服务于 DataReader 的连接的必要时间,这影响了性能。 
     f、使用 XML 操作对数据进行操作,例如可扩展样式表语言转换(XSLT 转换)或 XPath 查询。

 

对于下列情况,要在应用程序中使用 DataReader:
   a、不需要缓存数据。
   b、要处理的结果集太大,内存中放不下。 
   c、以只进、只读方式快速访问数据的操作。

 

如何使用和优化访问DataSet 与 DataReader 所包含的数据呢?

 (1)使用DataSet

   DataSet可以执行断开式的访问数据,是一个强类型的远程访问对象。填充 DataSet 时,DataAdapter 使用 DataReader。因此,使用 DataAdapter 取代 DataSet 提升的性能表现为节省了 DataSet 占用内存和填充 DataSet 需要的循环。一般来说,此性能的提升只是象征性的,因此,设计决策应以所需功能为基础。 
  使用强类型 DataSet 的好处 :
DataSet 的另一个好处是可被继承以创建一个强类型 DataSet。强类型 DataSet 的好处包括设计时类型检查,以及 Microsoft Visual Studio .NET 用于强类型 DataSet 语句结束所带来的好处。修改了 DataSet 的架构或关系结构后,就可以创建一个强类型 DataSet,把行和列作为对象的属性公开,而不是作为集合中的项公开。例如,不公开客户表中行的姓名列,而公开 Customer 对象的 Name 属性。类型化 DataSet 从 DataSet 类派生,因此不会牺牲 DataSet 的任何功能。也就是说,类型化 DataSet 仍能远程访问,并作为数据绑定控件(例如 DataGrid)的数据源提供。如果架构事先不可知,仍能受益于通用 DataSet 的功能,但却不能受益于强类型 DataSet 的附加功能。

 (2)使用 DataReader
使用 DataReader 获得最佳性能的技巧

a、 在访问相关 Command 的任何输出参数之前,必须关闭 DataReader。 
b、完成读数据之后总是要关闭 DataReader。如果使用 Connection 只是用于返回 DataReader,
那么关闭 DataReader 之后立刻关闭它。另外一个显式关闭 Connection 的方法是把 CommandBehavior.CloseConnection 传递给 ExecuteReader 方法,以确保相关的连接在关闭 DataReader 时被关闭。如果从一个方法返回 DataReader,而且不能控制 DataReader 或相关连接的关闭,则这样做特别有用。  
c、 不能在层之间远程访问 DataReader。DataReader 是为已连接好的数据访问设计的。 
d、当访问列数据时,使用类型化访问器,例如,GetString、GetInt32 等。这使您不用进行将 GetValue 返回的Oject  强制转换成特定类型所需的处理。 
e、一个单一连接每次只能打开一个 DataReader。在 ADO 中,如果打开一个单一连接,并且请求两个使用只进、只读游标的记录集,那么 ADO 会在游标生存期内隐式打开第二个、未池化的到数据存储区的连接,然后再隐式关闭该连接。对于 ADO.NET,“秘密”完成的动作很少。如果想在相同的数据存储区上同时打开两个 DataReader,就必须显式创建两个连接,每个 DataReader 一个。这是 ADO.NET 为池化连接的使用提供更多控制的一种方法。 
f、默认情况下,DataReader 每次 Read 时都要把整行加载到内存。这允许在当前行内随机访问列。如果不需要这种随机访问,为了提高性能,就把 CommandBehavior.SequentialAccess 传递给 ExecuteReader 调用。这将 DataReader 的默认行为更改为仅在请求时将数据加载到内存。但是,CommandBehavior.SequentialAccess 要求顺序访问返回的列。也就是说,一旦读过返回的列,就不能再读它的值了。  
g、 如果已经完成读取来自 DataReader 的数据,但仍然有大量挂起的未读结果,就在调用 DataReader 的 Close 之前先调用 Command 的 Cancel。调用 DataReader 的 Close 会导致在关闭游标之前检索挂起的结果并清空流。调用 Command 的 Cancel 会放弃服务器上的结果,这样,DataReader 在关闭的时候就不必读这些结果。如果要从 Command 返回输出参数,还要调用 Cancel 放弃它们。如果需要读取任何输出参数,不要调用 Command 的 Cancel,只要调用 DataReader 的 Close 即可。 

      以上只是个人的尝试经验,有不足请指出,咱们互相学习吧!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值