DataSet与DataReader的区别

来源:互联网 发布:虾米音乐知乎 编辑:程序博客网 时间:2024/05/01 02:09

ADO.NET提供以下两个对象,用于检索关系数据并将其存储在内存中:DataSet和DataReader。DataSet提供一个内存中数据的关系表示形式,一整套包括一些表在内的数据(这些表包含数据、对数据进行排序并约束数据),以及表之间的关系。DataReader提供一个来自数据库的快速、仅向前、只读数据流。
当使用DataSet时,经常会利用DataAdapter(也可能是CommandBuilder)与数据源进行交互。当使用DataSet时,也可以利用DataView对DataSet中的数据应用排序和筛选。也可以从DataSet继承,创建强类型DataSet,用于将表、行和列作为强类型对象属性公开。
下列主题包括的信息涉及:使用DataSet或DataReader的最佳时机、如何优化访问它们所包含数据、以及如何优化使用DataAdapter(包括CommandBuilder)和DataView的技巧。

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

对于下列情况,要在应用程序中使用DataReader:
r 不需要缓存数据。
r 要处理的结果集太大,内存中放不下。
r 一旦需要以仅向前、只读方式快速访问数据。
注填充DataSet时,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表现为节省了DataSet占用内存和填充DataSet需要的循环。一般来说,此性能提升只是象征性的,因此,设计决策应以所需功能为基础。

 

=================================另一种声音===========================

ADO.NET2.0提供了两个用于检索关系数据的对象:DataSet和DataReader。并且这两个对象都可以将检索的关系数据存储在内存中。在软件开发过程中经常用到这两个控件,由于这两个控件在使用和功能方面的相似,很多程序员错误地认为DataSet和DataReader是可以相互替代的。这种想法是错误的,在这一小节将会讲到DataSet控件和DataReader控件的区别。

■ 与数据库连接

DatSet 连接数据库时是非面向连接的。把表全部读到Sql中的缓冲池,并断开于数据库的连接。

Datareader 连接数据库时是面向连接的。读表时,只能向前读取,读完数据后有用户决定是否断开连接。

■ 处理数据速度

DataSet读取、处理速度较慢。

DataReader读取、处理速度较快。

■ 更新数据库

在对DataSet数据集中的数据进行更新后,可以把数据更新回原来的数据库。

在对DataReader中的数据进行更新后,没有办法进行数据库更新。 

■ 支持分页排序

在DataSet中支持分页、动态排序等操作。

在DataReader中没有分页、动态排序的功能。

■ 占用内存

DataSet在 IIS 服务器上所使用的内存较多。

DataSet在 IIS 服务器上所使用的内存较少。

综上所述得出DataSet和DataReader有各自适用的场合。如果数据来源控件只是用来填入控件的清单成为其选项,或者数据绑定控件并不需要提供排序或分页功能的话,则应该使用 DataReader。反之,如果数据绑定控件需要提供排序或分页功能的话,则必须使用DataSet,通过DataSet设置出来分页排序等页面面显示效果。

8.7.2 如何提高DataSet读取XML的效率
在8.6.1节中讲了使用DataSet的ReadXML方法,把XML文件文件中的数据和架构读取到DataSet数据集中。在XML文件文件中的数据量不大,或者数据架构不复杂的情况下,使用这种方法读取的速度很快,但是对于大文件的读取速度就会明显的降下来,影响程序的运行。在这一小节中将讲到如何提高DataSet读取XML文件的效率。

方法很简单,首先创建一个DataSet实体ds,接下来使用ReadXml方法读取存在的XML文件文件,最后在加载数据后打开通知和约束。代码如下所示。

string inFile;

//判断xml文件是否存在

if (File.Exists(inFile))   

{

//创建DataSet对象,用来读取xml文件

DataSet ds = new DataSet();

using (StringReader sr = new StringReader(inFile))

{

//ds读取xml文件信息

ds.ReadXml(sr, XmlReadMode.IgnoreSchema);

}

//加载数据后打开通知和约束

ds.Tables[0].EndLoadData();

}

8.7.3 如何使用sql语句返回DataSet数据集
    在本小节中主要讲使用sql命令语句的方式来返回数据集。使用sql命令语句把从数据库中检索出来的信息保存在DataSet数据集中。实例代码如下所示。

string sConnectionString; //声明一个字符串

//连接数据库字符串

sConnectionString = " Data Source=.;Initial Catalog=XBMIS;User ID=sa; ";

//创建SqlConnection数据库连接对象

SqlConnection Conn = new SqlConnection(sConnectionString);

//创建SqlDataAdapter对象adapter,Conn是数据库连接字符串

SqlDataAdapter adapter = new SqlDataAdapter("Select * From T_LunWZhT", Conn);

DataSet ds = new DataSet();

adapter.Fill(ds);

//关闭数据库连接函数

GridView3.DataSource = ds.Tables[0];

GridView3.DataBind();

运行效果

将上面代码拷贝到页面的后台代码中,运行程序,显示结果如图8-31所示。

 

图8-31 GridView中显示DataSet中的数据

8.7.3          如何使用存储过程返回DataSet数据集
在上一小节中主要讲了使用sql语句返回DataSet数据集的方式。在本小节中将介绍使用存储过程实现返回数据集的方式。

存错过程代码如下:

ALTER procedure T_LunWZhT

as

Select zhuangtbh as 编号,zhuangtmc as 名称 From T_LunWZhT

存储过程的名称是:T_LunWZhT。作用是:从T_LunWZhT中查寻出来编号和名称的信息。

下面给出调用存储过程T_LunWZhT的代码,如下所示。

string sConnectionString; //声明一个字符串

//连接数据库字符串

sConnectionString = " Data Source=.;Initial Catalog=XBMIS;User ID=sa; ";

//创建SqlConnection数据库连接对象

SqlConnection Conn = new SqlConnection(sConnectionString);

//创建SqlDataAdapter对象adapter,Pro_ ZhuangTai是存储过程名

SqlDataAdapter adapter = new SqlDataAdapter();

adapter.SelectCommand = new SqlCommand("Pro_ZhuangTai", Conn);

adapter.SelectCommand.CommandType = CommandType.StoredProcedure;

//创建ds并填充数据集

DataSet ds = new DataSet();

adapter.Fill(ds);

//关闭数据库连接函数

GridView3.DataSource = ds.Tables[0];

GridView3.DataBind();

运行效果

将上面代码拷贝到页面的后台代码中,运行程序,显示结果如图8-32所示。

 

图8-32 GridView中显示DataSet中的数据

8.7.4 关于DataSet.WriteXml()的问题
使用DataSet的WriteXml()方法,可以将DataSet中的数据和架构写入到XML文件文件中保存。通常在WriteXml()方法中使用的参数是String类型的,但是WriteXml()方法还有另外的一种参数类型Stream类型。

两种WriteXml()方法的完整写法如下所示:

DataSet.WriteXml(String filename)

DataSet.WriteXml(Stream filename)

这两种方法的区别:

使用DataSet.WriteXml(String filename)生成的XML文件中包含XML 声明,也就是包含XML文件文件的头文件, 即<?xml version="1.0" standalone="yes"?>。

而使用DataSet.WriteXml(Stream filename) 生成的XML文件文件中却不会写入XML声明。

 

原创粉丝点击