日期:2009-01-16  浏览次数:20487 次

选择正确的API从SQL Server获取XML数据。
by Greg Ewing and Jon Rauschenberger
技术工具箱: C#, SQL Server 2000, ASP.NET, XML, VB6

.NET Framework包含几个新的数据存取APIs,每种API对访问SQL Server中XML数据的支持程度都不同。在如何完成你的解决方案、需要写多少代码方面,选择不同的API将会有不同的结果。在本专栏中,我将阐述Microsoft的四种XML数据存取APIs:ActiveX Data Objects (ADO) 2.6、ADO.NET、SqlDataReader和 SQLXML。

我们将重点讲述实现每种API需要的代码,并比较每种API提供的性能和可扩展性。通过一步步构建查询一个Northwind数据库所需要的代码,将结果转化成XML,我们来逐个说明这些API。然后通过对它们进行一些负载测试,我们来看看它们的性能如何。

要确定哪种XML数据存取API能够最好地满足你的需求,你需要考虑几个因素。首先,看一下每种API需要的代码量。然后,考虑你有多大的灵活性来控制API返回的XML格式。有时候,你不能控制XML的格式。最后,考虑API是如何执行和扩展的。因为SQL Server没有将本地数据存为XML,所以将数据从本地的SQL Server二进位格式转换成XML所需要的费用可能很高,可能会限制你的应用程序的性能和可扩展性

ADO是一个受欢迎的数据存取API。Microsoft最初在ADO 2.1中增加了将结果集转换成XML的支持功能,这就使你可以将一个结果集存为一个XML文件。相对于ADO 2.6对XML有限的支持,ADO.NET增加了许多新的XML功能。ADO.NET DataSet对象支持将结果集串行化成格式规范的XML。

让我们开始做个样例程序吧,打开VS.NET,创建一个新的C#类库。将Class1.cs重新命名为DBXML.cs,并取消名字空间。然后,添加引用System.Data.dll,它包含ADO.NET名字空间。接着,打开ADONet类并引入这些名字空间:using System.Data;
using System.Data.SqlClient;




现在,给DBXML 类添加代码,连接到数据库并用ADO.NET来执行SELECT语句(见列表1)。

列表1:

C# 用ADO.NET执行一个SQL SELECT语句

运用SqlDataAdapter可以很容易地通过构造器访问SQL SELECT命令,而且可以通过Selectcommand的Parameters集合访问任何必要的参数。通过运用InsertCommand和UpdateCommand属性,连同它们相关的Parameters集合,你就可以插入或更新数据。
     public string ExecuteSelect
   (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();
   mySqlDataAdapter1.Fill
      (myDataSet,"Customers");

   return myDataSet.GetXML();
}




ExecuteSelect函数做的第一件事就是通过传递连接字符串到构造器用SqlConnection类来初试化一个到数据库的连接。然后,创建 SqlDataAdapter,将SELECT语句和连接对象传递到构造器中。SELECT语句有一个参数用于你选择的用户的ID,所以你必须将那个参数添加到SelectCommand Parameters集合中。Add函数可以接受参数的名字、数据类型、大小和列的关连。一旦这个参数是集合的一部分,你需要给它赋以正确的值。

下面的两步,创建DataSet并用适配器填充它,完成了大部分工作。如果连接没有打开,用DataAdapter上的Fill方法来打开连接,或者用已打开的连接,它通常返回到最初的状态。然后,你用GetXML函数将DataSet转换成XML字符串,返回给调用者。

运用SqlDataReader
SqlDataReader为数据存取提供了一个连续的、只读的指针,使其成为从SQL Server读取数据的最快的方式。DataReader对XML没有提供本地的支持,所以你必须自己写XML转换代码或运行一个返回XML的查询过程。对于这个例子,你可以用FOR XML RAW子句让SQL Server返回XML的数据。

运用SqlDataReader,写代码来执行SELECT语句并返回XML的结果(见列表2)。

列表2:
C# 获取XML数据
列表2.


以下代码说明了如何运用SqlCommand对象和StringBuilder类来获取XML数据。运用StringBuilder是因为它连接字符串的速度很快、效率很高。
    public string ExecuteSqlDataReaderSelect(
   string CustomerID,
   string ConnectionString)
{
   SqlConnection mySqlConnection = new
      SqlConnection(ConnectionString);

   SqlCommand mySqlCommand = new
      SqlCommand("SELECT * FROM " +
 &nbs