[摘要]选择正确的API从SQL Server获取XML数据。 by Greg Ewing and Jon Rauschenberger 技术工具箱: C#, SQL Server 2000, ASP.NE...
选择正确的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 " +
"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();
SqlDataReader myDR =
mySqlCommand.ExecuteReader(
CommandBehavior.CloseConnection);
StringBuilder xml = new
StringBuilder(8192);
while (myDR.Read())
{
if (!myDR.IsDBNull(0))
xml.Append(myDR.GetString(0));
}
return xml.ToString();
}
该方法中的第一行代码同ExecuteSelect函数一样。同DataSets一样,SqlDataReader依赖于一个SqlConnection对象。通过将SQL语句和Connection对象传递到构造器来创建Command对象。
在打开数据库连接后,通过给SqlDataReader赋以Command.ExecuteReader方法的返回值来创建SqlDataReader。然后,用StringBuilder类从SqlDataReader读取XML。在处理大的字符串方面,StringBuilder类比String类的字符串处理方法更有效。
调用 GetString(0)来得到与当前行的数据相关的字符串。结果集在一个很长的XML字符串中,所以你只需要反复调用read(),直到DataReader为空。一旦你创建了字符串,只需要把它返回给调用者就行了。
运用VS.NET得到XML数据的最后一个方法就是通过运用SQLXML托管类,它们是SQLXML 3.0功能包的一部分(见资源)。SQLXML功能包扩展了SQL Server 2000的XML功能。3.0版本中的托管类是.NET Framework的本地类,它们可以使用新增加的XML功能。
……