| 在探讨DataSet和XML之前,我们首先对ADO.NET进行初步的了解。可以说ADO.NET是各种各样数据访问技术中最新的一种,它已经成为构建.Net数据库应用程序的基础,尽管如此,ADO.NET并不是完全以数据库为核心的,它集成 
                      XML 支持,提供了平台互用性和可伸缩的数据访问(这也是ADO.NET和ADO的最大区别)。 在ADO.NET组件中DataSet是其核心组件之一,它提供了独立于数据源的数据访问,为了实现这种平台互用性和可伸缩的数据访问,ADO.NET采用了基于XML数据的传输格式,XML在这里充当了至关重要的脚色。当数据传输时,ADO.NET是将DataSet表述为XML,然后以XML格式传递给其他组件。DataSet 
                      的这种设计使我们能够使用 XML 方便地通过 Web 将数据传输,当然接收数据的组件不一定就是ADO.NET组件,它可以是任何可以处理XML数据的组件,从这里我们可以明显的看出ADO.NET比ADO的强大之处。
 图1阐述了.NET数据提供程序、DataSet、XML之间的关系:
  
 图1
 
  由DataSet数据转换为XML数据  为了比较形象的说明DataSet和XML之间的关系,我们利用VS.NET环境开发两个例子来详细的说明。 下面我们来看第一个例子,如何使用ADO.NET把DataSet数据写入到XML文件中。我们使用Sql Server2000系统自带的Pubs库,生成关于作者(Authors)信息的XML文件。首先新建一个名为DataToXml的Windows应用程序,打开VS.NET,执行如下步骤:文件——>新建——>项目,弹出如图2的窗口,输入项目名称:DataToXml,以及保存项目的位置,点击“确定”,完成项目的创建工作,此时VS.NET默认会创建一个名为Form1的Windows 
                      Form(图3)。
   图2
  图3
 
 
 下一步,创建我们要操作DataSet数据集的窗体,新建名为DataToXmlSample的Windows Form。执行如下步骤:在项目资源管理器右击DataToXml——>添加——添加Windows窗体(图4),弹出创建“添加新项”窗口,输入DataToXmlSample(图5)。当然,也可以把VS.NET在创建Windows项目时VS.NET创建的Form1改名为我们需要文件名。 
 
 图4
 在DataToXmlSample窗体上添加我们需要的控件,在这个例子中,我们需要一个名为lbxXmlData的ListBox,用来浏览从数据库中取出的信息,两个Button按钮,一个是btnViewXml,一个是btnBuildFile,如图6一样简单的在窗体上布置这三个控件。窗体的设置工作完成后,下一步进行我们最关键的编码工作。 图5
 
 
  图6
 要运行这个样例,需要导入Data、Xml、Data SqlClient 、IO名称空间。我们先从创建DataSet开始我们的编码,创建CreateDataSet()方法返回类型为DataSet,这样就可以在别的方法中直接调用该方法,取得DataSet。
 
                      
                        | public DataSet 
                            CreateDateSet()  {  // 创建到Sql Server数据库的连接  stringstrconn="DataSource=localhost;Database=Pubs;uid=sa;pwd=";  SqlConnection conn = new SqlConnection 
                            ();  conn.ConnectionString = strconn;  conn.Open();   // 创建关于Authors表的数据集  string strAuthorsSql = "SELECT 
                            * FROM authors";  SqlDataAdapter da = new SqlDataAdapter(strAuthorsSql,conn);  da.SelectCommand.CommandType = CommandType.Text;  // 声明DataSet  DataSet ds = new DataSet();  da.Fill (ds,"XMLAuthors");  // 返回DataSet数据集  return ds;  } |    下一步编写代码生成Xml数据流,编写BuildXml()方法: 
                      
                        | public XmlDocument 
                            BuildXml()  {  // 声明MemoryStream对象  XmlDocument doc=new XmlDocument();  MemoryStream mStrm = new MemoryStream 
                            ();  StreamReader sRead = new StreamReader(mStrm); 
                            // 调用CreateDataSet方法把DataSet中的数据输出  CreateDateSet().WriteXml (mStrm,XmlWriteMode.IgnoreSchema);  // 从数据流的开始位置进行搜索  mStrm.Seek (0,SeekOrigin.Begin);  // 将数据流加载到XmlDocument  doc.Load (sRead);  return doc;   }  创建写入XML文件的方法BuildFile():  private void BuildFile()  {  // 要写入文件的路径  string filepath = "F:\\Authors.xml";  CreateDateSet().WriteXml(filepath); 
                            } |    创建写入XML文件的方法BuildFile():  
                      
                        | private 
                            void BuildFile()  {  // 要写入文件的路径  string filepath = "F:\\Authors.xml";  CreateDateSet().WriteXml(filepath); 
                            } |     好了,现在基础工作我们都完成了,下一步需要我们把这些方法组合起来,完成我们的目的。回到设计窗口,双击“View 
                      Xml”按钮,切换到代码编辑窗口,可以看到系统自动增加了一个btnViewXml_Click()方法。在该方法中,我们添加如下代码把XML数据流填充到ListBox控件中。 
                     
                      
                        | private void 
                            btnViewXml_Click(object sender, System.EventArgs e)  {  // 清除ListBox的所有项  lbxXmlData.Items.Clear();  XmlNodeList ndList = BuildXml().GetElementsByTagName("XMLAuthors");  foreach(XmlNode xn in ndList)   lbxXmlData.Items.Add (xn.InnerText); 
                           } |     再次回到设计窗口,双击“Build File”按钮,切换到代码编辑窗口,在系统自动添加的btnBuildFile_Click()方法中添加如下代码调用上面的BuildFile()方法以生成Authors.xml文件。 
                      
                        | private void 
                            btnBuildFile_Click(object sender, System.EventArgs 
                            e)  {  BuildFile();  } |     为了让我们的Windows应用程序能够运行,还需要给程序提供一个入口点: 
                      
                        | [STAThread]  static void Main()   {  Application.Run(new DataToXmlSample());  } |     好了,到此为止我们这个程序所有的Coding工作都已完成,让我们来品尝我们的劳动果实吧!双击VS.NET工具栏的"启动"按钮,启动应用程序显示如图7窗口,单击"View 
                      Xml"按钮调用btnViewXml_Click()方法,ListBox将被纪录填充(图8)。单击"Build 
                      File"按钮,调用btnBuildFile_Click()方法,在F盘根目录下生成Authors.xml(如图9)。  
 
 图7
 
  图8   
 图9
 
  到此为止,我们的第一个例子:从DataSet到XML的转换已经圆满的完成了。下一个例子,要把刚才生成的Authors.xml文件的数据再填充到DataSet中,完成一次数据的轮回。  由XML数据转换为DataSet数据按照刚才创建DataToXml项目的方式创建XmlToData项目,并在在该项目中添加一个Form窗体,命名为XmlToDataSetSample。在窗体上添加一个名为dgViewXml的DataGrad控件,一个名为btmLoadXml的Button控件。单击"Load 
                      Xml"按钮切换到代码编辑窗口,输入如下代码:
 
                      
                        | private void 
                            btnLoadXml_Click(object sender, System.EventArgs e)  {   DataSet ds = new DataSet();  string filepath = "F:\\Authors.xml";  ds.ReadXml (filepath);  dgViewXml.DataSource = ds;  dgViewXml.DataMember = "XMLAuthors"; 
                            } |    添加程序入口点: 
                      
                        | [STAThread]  static void Main()   {  Application.Run(new XmlToDataSetSample());  } |     单击工具栏上的"启动"按钮,启动应用程序(如图10),单击"Load Xml"按钮,程序调用btnLoadXml_Click()方法,把Authors.xml中的数据填充到DataSet中并显示在DataGrid控件中(图11)。  
 
 图10
  图11
 
  结束语  .NET Framework提供了操作XML的强大支持,在.NET Framework中,DataSet和XML文档是相同数据的不同视图。  ADO.NET对XML的支持为应用程序间的数据共享提供了易于开发的解决方案,改变了典型分布式系统的面貌。 
                     |