C#中ADO.NET与XML数据交互技术

由于XML(Extensible Markup Language)具有良好的数据描述功能和存储格式,并且有很高的可扩展性和共享性,所以XML技术得到了快速发展及普遍应用。XML已成为从中间层传送数据到桌面的工具。由于XML的数据可以通过中间层代理与多种后端(数据库)源集成,所以XML技术已得到很多软件平台和数据库制造商的支持。Microsoft的.NET围绕XML这一核心提供了一个强大而快速的开发工具——C#,它具有前所未有的高开发效率。特别是在XML与ADO.NET编程方面,通过XML类和ADO.NET之间的紧密集成,将关系数据和XML在.NET框架中结合在一起。

     1 ADO.NET体系结构

  ADO.NET是由一系列的数据库相关类和接口组成的,它的基石是XML技术。通过ADO.NET不仅能访问关系型数据库中的数据,而且还能访问层次化的XML数据。

  ADO.NET提供了二种数据访问的模式,即连接模式(Connected)和非连接模式(Disconnected)。ADO技术中就有连接模式,而非连接模式是ADO.NET中才具有的。与传统的数据库访问模式相比,非连接模式为应用程序提供了更大的可升级性和灵活性。在该模式下,一旦应用程序从数据源中获得所需的数据,它就断开与原数据源的连接,并将获得的数据以关系数据库中表的形式存放在主存中。在应用程序处理完数据后,它再取得与原数据源的连接并完成数据的更新工作。

  ADO.NET中的DataSet类是非连接模式的核心,它提供了一个与数据来源无关的数据表示方式,数据集对象(DataSet)可以将其中的数据以XML的形式存放。用户既可以从远程或本地的一个数据库中获取数据集对象,也可以从一个XML数据流中获取数据集对象。而从用户的角度来看,数据源在哪里并不重要,也无需关心。这种统一的编程模型可被运用于任何使用了数据集对象的应用程序。

  在ADO.NET体系结构中还有一个非常重要的部分,即数据提供者对象(Data Provider),它是访问数据库的必备条件。通过它可以实现对实际数据库的操作,操作的结果或者在连接模式被直接处理,或者产生相应的数据集对象。.NET Data Provider是一个数据源和应用程序间尽可能小的层,从而在不牺牲功能的前提下提高了性能。

图1为ADO.NET总体的体系结构。

    2  使用DataSet对象访问XML数据

    NET提供了一个XmlDataDocument类,它扩展了XmlDocument类。XmlDocument类不仅可以将XML文档载入内存的文档树中,还可以通过XmlDataDocument对象的DataSet属性存储、获取和操纵这些结构化的数据。DataSet对象在传输时是以XML流的形式,而不是用ADO中的Recordset对象的COM对象的形式,这使得在异构系统间传递数据更为方便。DataSet对象具有非常多的XML操作特性,通过它读取XML数据文件或数据流,从而将树型层次结构的XML数据转换为关系型数据结构的形式。对于树型层次结构的XML数据,要使用DOM对象模型来描述和操纵;对关系表要使用表(DataTable)、列(DataColumn)、行(DataRow)等对象来描述和操纵。这样,就可以使用.NET提供的DataSet对象和XmlDataDocument对象从二个不同的角度操纵内存中的同一数据。

  要对XML的数据集进行操作,首先要加载XML文件。XML文件有XSD Schema数据模式文件、XML无内联模式数据文件、XML内联模式数据文件等类型。读取XSD Schema数据模式文件可以使用DataSet对象的ReadXmlSchema方法从XSD文件或流中导入数据。ReadXmlSchema方法有多个重载版本,可以接受Stream、String、Textreader和XmlReader对象。通过这些对象中的任意一个可以告诉ReadXmlSchema方法从哪个XSD Schema文件或流中获取Schema。这种方法只能获取XML数据的组织模式,而不能获取XML数据。要读取XML数据文件可以使用DataSet对象的ReadXml方法从XML文件或流中导入数据。在读取的XML数据文件中,如果包含Schema数据组织方式,则这种方法可以在读取XML数据的同时使用内联的XSD Schema获取XML数据组织方式;如果在XML文件中不存在内联的Schema模式,则ReadXml方法会根据XML数据尝试推断的方法来生成Schema;如果在给定的XML数据中无法推断出Schema,则会抛出异常。例如:

  

  在导入XML XSD Schema文件或内联Schema的XML数据文件后,DataSet对象在数据集中建立相应的数据组织模式,通过DataSet对象的Tables属性,可以获取所有表的信息。对于每一个表,还具有一个Columns属性,根据该属性可以获取表中所有列的信息;对于每一列,通过DataType属性可以获取该列的数据类型。因此,可以在这些表和列的集合中进行循环,获取数据模式或数据。代码如下:

   

  DataSet对象的视图中可以包含XML文件中的所有数据,也可以根据需要只映射其中的一部分数据。为此,可以先生成一个不包含数据的DataSet对象,并为该对象定义数据组织模式,然后将它与一个XmlDataDocument对象同步,使用XmlDataDocument对象向其中填充数据。这时,DataSet对象的表名和列名作为数据组织模式的一部分,与XML文档中的部分标记相匹配,在XML文档中选取匹配的元素映射到DataSet数据集中。这样该数据集仅反映整个XML文档层次模式中用户所需要的部分,可以节约内存资源。但需注意的是所添加的表名和列名必须和XML文档中的元素严格匹配,否则会引发InvalidOperationException异常。例如:

  

     3 从数据库的表中输出XML数据

  SQL Server数据库具有输出XML数据的能力。SQL Server .NET Data Provider支持以XML形式表示的查询结果。下面介绍其他数据库表示为XML形式的方法。DataSet类作为ADO.NET中的非连接模式的核心,提供了一个与数据来源无关的数据表示方式。由于XML与DataSet类紧密集成,因此可以通过ADO.NET连接数据库并将操作结果生成DataSet数据集。有了DataSet数据集就可以将其数据输出为Xml Schema或XML文件的形式。输出方法有二种,一种是使用DataSet对象的GetXmlSchema方法输出Xml Schema,使用GetXml方法输出XML数据,GetXmlSchema、GetXml方法都返回一个字符串;另一种输出方法是调用DataSet对象中的WriteXml方法和WriteXmlSchema方法,WriteXml方法输出XML数据,WriteXmlSchema方法输出Xml Schema。这二个成员方法分别和ReadXml、ReadXmlSchema方法对应,也有多个重载版本,可以将数据和数据模式写到流对象、磁盘文件等。例如:

  OleDbConnection myConn=new OleDbConnection

         (″Provider=Microsoft.Jet.OLEDB.4.0;

         Data Source=....txl.mdb″);

  OleDbDataAdapter myCommand=new OleDbDataAdapter

         (″select *from b1″,myConn);

  DataSet ds=new DataSet();

  myCommand.Fill(ds,″b1″);

  //下面通过调用DataSet对象中的WriteXml方法,可以将

  //DataSet转换为XML文档,该方法中第一个参数为路径文

  //件名,第二个参数为XML文档增加了一个内联XSD模式,

  //描述DataSet的相关结构。

  ds.WriteXml(″....txl.xml″,XmlWriteMode.WriteSchema);

  如果拥有包含数据的DataSet对象而希望以XML层次模型的方式访问DataSet中的数据,则可以将该DataSet对象作为参数传递给XmlDataDocument对象的构造函数。XmlDataDocument中的数据是对DataSet对象中数据的引用,而不是拷贝,这样创建出来的XmlDataDocument对象将和DataSet对象同步。因此对这二个对象中任一对象数据的修改,将会实时地反映到另一对象中。创建过程如下:

    OleDbConnectionmyConn=new OleDbConnection

           (″Provider=Microsoft.Jet.OLEDB.4.0;

  Data Source=....txl.mdb″);

    OleDbDataAdaptermyCommand=new OleDbDataAdapter

           (″select *from b1″,myConn);

    DataSet ds=newDataSet();

    myCommand.Fill(ds,″b1″);

  XmlDataDocument doc=new XmlDataDocument(ds);

    4  结束语

    XML和关系型数据表是二种有效的数据视图。.NET Framework提供了XmlDocument用来实现DOM编程接口,从而使用户可以从XML层次视图的角度处理数据。.NET Framework还提供了DataSet来表示关系数据模型,从而允许从二维表格、行、列和关系的角度来处理数据。在不同的应用场合下,要使用不同的数据视图来处理数据。XmlDataDocument对象集成了数据集对象DataSet和XML文档对象XmlDocument,利用它可以处理关系数据或XML数据,并自动维持关系数据视图和DOM视图,使其同步。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值