本节主要介绍在使用DataSet对象的时候常遇到的问题,以及在使用DataSet时候的一些技巧性问题。
8.7.1 DataSet和DataReader的区别
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的效率
在
方法很简单,首先创建一个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声明。