日期:2012-11-06  浏览次数:20628 次

一.前言:

  XML作为Web服务的基石,其重要性自然是不言而喻的,它正日益被开发人员所重视。同时随着各类新兴开发工具的推出,XML数据的访问机制也变得越来越灵活多样。.Net框架为开发人员提供了几种新的XML数据访问机制,每种机制都提供了不同的XML数据访问支持。所以对于开发人员而言,选择正确合适的XML数据访问机制变得相当重要,它会影响到项目开发的复杂度以及应用程序的整体效率。

  大体来讲,.Net框架为开发人员提供了ADO.Net中的数据集XML数据访问机制和SqlDataReader XML数据访问机制这两种新的机制。为方便起见,我们不妨将前一种机制称为ADO.Net机制,而后一种为SqlDataReader机制。本文我就主要向大家介绍这两种机制,同时我还会介绍SQLXML和ADO 2.6这两种比较传统的XML数据访问机制,并在最后将它们的性能做一个比较,以使读者更清楚在具体的应用中应选择哪种机制。本文的实例程序将用到SQL Server中的Northwind数据库,通过访问该数据库我们可以获取相应的XML数据并据此对不同的访问机制进行性能比较和分析。

二.各种机制介绍:

  ADO.Net是ADO升级版本,它为我们提供了全新的数据访问机制,在提高数据访问效率的同时它也大大简化了开发人员的工作量,所以熟练掌握和运用ADO.Net进行开发是.Net开发人员不可或缺的基本能力。

  ADO.Net为开发人员提供了两种数据访问模式:一种为连接模式(Connected),另一种为非连接模式(Disconnected)。前一种模式和传统的ADO模式是一样的,而后一种模式则为.Net所独有也是为.Net所推荐的,该模式的核心部分为ADO.Net中的数据集对象(DataSet)。数据集对象的类位于System.Data命名空间中,它对XML有相当完善的支持。在非连接模式下工作时,数据集对象能以XML的形式将数据存储在主存中并提供用户操作使用,因此通过一个简单的方法它就能将关系型的数据转化为层次化的具有良好模式的XML数据,这就是前面提到的ADO.Net机制。

  下面,我就通过建立一个实例程序向大家介绍该机制下的XML数据访问的具体方法。首先新建一个控制台应用程序的C#项目,该实例程序主要显示了不同的XML数据访问机制的运行效率。同时添加一个新的类,文件名不妨命名为DBXml.cs,该类包含了几种XML数据访问机制的不同实现方法,它们分别是:ExecuteADONetSelect、ExecuteSqlDataReaderSelect以及ExecuteSqlXmlSelect,分别代表了ADO.Net机制、SqlDataReader机制和SQLXML机制,而ADO 2.6这种机制则会在后面介绍。接着,为该类添加必要的命名空间。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Xml;
using Microsoft.Data.SqlXml;



其中对于Microsoft.Data.SqlXml命名空间需要先添加对Microsoft.Data.SqlXml组件的引用,而该组件是在安装了SQLXML 3.0以后就会有的,添加的方法如图1所示:




图1


现在为该类添加ExecuteADONetSelect()方法,该方法执行了对数据库的SELECT查询操作,具体实现如下:

public string ExecuteADONetSelect(string CustomerID,
string ConnectionString)
{
// 创建一个数据库连接对象
SqlConnection myConnection = new SqlConnection(ConnectionString);
// 创建一个数据适配器对象
SqlDataAdapter mySqlDataAdapter1 = new SqlDataAdapter("SELECT *
FROM customers WHERE CustomerID = @CustomerID", myConnection);
// 为其参数集添加参数
mySqlDataAdapter1.SelectCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID");
mySqlDataAdapter1.SelectCommand.Parameters["@CustomerID"].
Value = CustomerID;
// 创建一个数据集对象
DataSet myDataSet = new DataSet();
// 运用数据集对象的Fill方法来填充数据集对象
mySqlDataAdapter1.Fill(myDataSet,"Customers");
// 关闭数据库连接
myConnection.Close();
// 返回数据集对象中的数据的XML形式
return myDataSet.GetXml();
}



以上ExecuteADONetSelect()方法首先根据传入的数据库连接字符串创建一个SqlConnection对象,然后创建一个SqlDataAdapter对象,并传递一条SELECT语句和上面的SqlConnection对象到其构造函数中。其中的SELECT语句中包含了一个用户ID参数,所以你必须将该参数添加到SqlDataAdapter对象的SelectCommand参数集中并为该参数赋值。接下来的两步创建了一个新的DataSet对象并用上面的SqlDataAdapter对象填充了该DataSet对象,这两步虽然简单,但它们却完成了大部分的工作。最后,关闭数据库连接并以XML的形式返回数据集对象中的数据。

接下来为该类添加ExecuteSqlDataReaderSelect()方法,该方法如下:

public string ExecuteSqlDataReaderSelect(string CustomerID,
string ConnectionString)
{
SqlDataReader myDataReader = null;
// 创建一个数据库连接对象
SqlConnection mySqlConnection = new SqlConnection
(ConnectionString);
// 创建一个数据库命令对象,并在SQL语句中运用FOR XML子句
SqlCommand mySqlCommand = new SqlCommand("SELECT * FROM Customers
WHERE CustomerID = @CustomerID FOR XML RAW", mySqlConnection);
mySqlCommand.CommandType = CommandType.Text;
// 为其参数集添加参数
mySqlCommand.Parameters.Add("@CustomerID", SqlDbType.Char, 5,
"CustomerID");
mySqlCommand.Parameters["@CustomerID"].Value = CustomerID;
mySqlConnection.Open();
// 执行数据库命令对象的ExecuteReader操作以取得一个数据阅读器对象
myDataReader = mySqlCommand.ExecuteReader(CommandBehavior.
CloseConnection);
// 创建一个StringBuilder对象以构造XML字符串
StringBuilder xml = new StringBuilder(8192);
// 不断从数据阅读器中获取XML数据并添加到StringBuilder对象中