在探讨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
图5
在DataToXmlSample窗体上添加我们需要的控件,在这个例子中,我们需要一个名为lbxXmlData的ListBox,用来浏览从数据库中取出的信息,两个Button按钮,一个是btnViewXml,一个是btnBuildFile,如图6一样简单的在窗体上布置这三个控件。窗体的设置工作完成后,下一步进行我们最关键的编码工作。
图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的支持为应用程序间的数据共享提供了易于开发的解决方案,改变了典型分布式系统的面貌。
|