现在的位置: 首页 > 综合 > 正文

ASP.NET 3.5核心编程学习笔记(15):DataSet

2013年03月13日 ⁄ 综合 ⁄ 共 2234字 ⁄ 字号 评论关闭

  DataSet类是ADO.NET对象模型中的主要组件,ADO.NET容器类与使用的数据源无关,也不保存任何与特定数据源有关的信息。

DataSet对象

       DataSet对象实现了3个重要的接口:

  1. 
IListSource使其能返回元素的可绑定数据列表。

  2.  ISeralizable使其能够控制数据序列化的方式,以便传给.NET格式化程序。

  3.  IXmlSerializable使其能将自身序列化为XML。

  下表列出了DataSet类的属性:

 

  Namespace和Prefix属性会影响DataSet将自身序列化为XML的方式。DataSet的名称用于设置XML文档的根节点。如果DataSetName为空,则使用默认名称NewDataSet。该类的方法见下表:

 

DataSet数据的读取

       DataSet和数据读取器都是ADO.NET应用程序读取数据的方法,但从根本上讲,ADO.NET只有一种读取数据的物理方法—使用数据读取器。DataSet通过读取器自动填充数据。

       我们可以通过DataSet的CreateDataReader方法创建数据读取器来读取数据。该方法返回一个DataTableReader对象,用于对“内存”中的表进行遍历。如下所示:      

DataSet data = new DataSet();
SqlDataAdapter adapter
= new SqlDataAdapter(“Select * From employees;Select * From pruducts”, connString);

adapter.Fill(data);

dataTableReader reader
= data.CreateDataReader();
do
{
while(reader.Read())
{
Response.Write(String.Format(“{
0} <br />”, reader[1]));
}
Response.Write(“
<hr/>”);
}
while(reader.NextResult());

reader.Close();

DataSet对象的合并

       Merge方法能够将两个DataSet对象合并在一起,这两个对象的模式应基本相同,但不要求严格相同。

       合并操作首先比较两个DataSet对象的模式,检查是否匹配。如果被导入的表包含新列或新表源,那么其结果取决于“缺少模式操作”的设置。在默认情况下,缺少的模式元素会被添加到DataSet中,但可通过Merge的另一重载版本(接受一个MissingSchemaAction参数)更改该行为。

       合并操作是一种原子性操作,能够确保完整性和一致性。为此,在合并操作的过程中,约束会被禁用。然而,如果合并到最后无法恢复原始约束,则会抛出异常,但这样并不会丢失源数据。在这种情况下,Merge方法完全禁用DataSet中的约束,它将EnforeConstraints属性设置为false,将所有无效数据标记为错误。为恢复约束,必须先处理那些错误。

DataSet提交模型

       当DataSet首次被加载时,所有表中的记录都被标记为“未更改”,行的状态存储在名为RowState的属性中。行状态的有效值定义在DataRowState枚举中。见下表:

 

       对DataSet成员执行的每种更改操作都会更改相关行的状态。在使用AcceptChanges方法前,所有更改将挂起,保持未提交状态。AcceptChanges方法用于提交所有更改,将当前值复制给原始值。在AcceptChanges被调用后,所有更改将被清除,更改的值会整合到相应行中,并显示为未更改。RejectChanges用于对所有更改过程中出错被挂起的更改进行回滚,恢复原始值。

数据的XML序列化

       将DataSet对象的内容序列化为XML有两种方法:无状态序列化、有状态序列化。

       无状态序列化是使用GetXML方法或WriteXml方法指对当前数据实例(即仅保存当前数据)做一个快照,并根据特定XML模式(ADO.NET一般范式)生成。

       有状态序列化是指序列化结果中包含数据的历史信息及与更改和挂起错误相关的信息。下表对定入选项进行了总结,可用模式都定义在WriteXmlMode枚举中:

 

       IngoreSchema是默认选项,以下代码给出了将DataSet序列化为XML文件的一般方法:

       dataSet.WriteXml(“c:\tmp.xml”);

序列化与远程格式

       除XML序列化外,DataSet还支持.NET二进制序列化。DataSet实现了ISerializable接口,能充分控制序列化过程。DataSet的RemotingFormat属性用于指定序列化格式为Xml(默认)或Binary。示例代码:      

DataSet ds = GetData();
ds.RemotingFormat
= SerializationFormat.Binary;
StreamWriter writer
= new StreamWriter(BinFile);
BinaryFormatter bin
= new BinaryFormatter();
bin.Serialize(writer.BaseStream, ds);
writer.Close();

抱歉!评论已关闭.