示例1首先打开数据库连接,该数据库由作为参数的连接字符串设置:
using (SqlConnection connection = new SqlConnection(connectionString))此后,创建SqlCommand对象实例,接着设置其属性:
SqlCommand command = connection.CreateCommand();此时,通过调用SqlCommand对象的ExecuteXmlReader()方法来执行实际查询:
command.CommandText = "SELECT DatabaseLogID, XmlEvent FROM " +
" DatabaseLog WHERE DatabaseLogID = " + ID.ToString() +
" FOR XML AUTO, ROOT('DatabaseLogs'), ELEMENTS”;
XmlReader reader = command.ExecuteXmlReader();然后,将XmlReader对象加载到XmlDocument,以便随后处理:
XmlDocument doc = new XmlDocument();当将XML加载到XmlDocument中后,接着会在序列中显示Complete XML,DatabaseLogID和XmlEvent列值。
// 将XmlReader对象加载到XmlDocument
doc.Load(reader);
读者已经了解了使用ExecuteXmlReader()同步执行FOR XML查询的方法。虽然这种方法可用,但是有时候从可扩展性和吞吐量的角度出发,可能希望异步执行查询。幸运的是,ADO.NET 2.0提供了一个异步执行SQL命令的新功能。使用这种新功能,开发人员可针对SQL Server数据库异步执行命令,而不用等命令执行完成。该功能在客户端应用程序(例如Windows Forms应用程序或者ASP.NET应用程序)完成需要长时间执行的数据库命令的情况下,非常方便。通过实现该功能,能够改进应用程序的整体性能和响应速度。下面将介绍使用ADO.NET 2.0异步功能执行FOR XML查询的方法,首先讲解的是异步执行FOR XML查询的步骤。
异步执行需要BeginXXX和EndXXX这样对应的方法。BeginXXX方法启动异步操作,同时立刻引用一个实现IAsyncResult接口的对象。客户端代码需要访问该接口,以便监视异步操作的过程。当异步操作完成时,可调用EndXXX方法来获取结果,同时清除用于支持异步调用的资源。
为使用BeginXXX和EndXXX方法实现异步调用,通常可使用四种常见方法。在所有的情况下,调用BeginXXX方法来初始化调用。此后,执行以下四个任务之一:
完成一些工作之后,接着调用EndXXX方法。如果异步操作未完成,那么在这些操作完成之前,EndXXX方法都将等待。
使用IAsyncResult.AsyncWaitHandle属性获取的WaitHandle调用WaitOne()方法,以便在操作完成之前,都进行等待。然后调用EndXXX方法。
轮询IAsynResult.IsCompleted属性的返回值,以便确定异步操作何时完成。然后调用EndXXX方法。
为提供给BeginXXX方法的回调函数(IasyncCallback类型)传递一个委托。当异步操作完成时,将执行回调函数。在回调函数的代码中调用EndXXX方法,从而获取结果。
示例2将说明使用WaitHandle获取执行异步查询的结果。
示例2:异步执行FOR XML查询
<%@ Page Language="C#" ValidateRequest="false" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Threading" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Web.Configuration" %>
<%@ Import Namespace="System.Data.SqlTypes" %>
<script runat="server">
void btnRetrieve_Click(object sender, EventArgs e)
{
int ID = Convert.ToInt32(txtID.Text);
string connectionString = WebConfigurationManager.ConnectionStrings["AdventureWorks"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT DatabaseLogID, XmlEvent " +
"FROM DatabaseLog WHERE DatabaseLogID = " + ID.ToString() +
" FOR XML AUTO, ROOT(‘DatabaseLogs’), ELEMENTS";
IAsyncResult asyncResult = command.BeginExecuteXmlReader();
// 此处完成一些其他处理
asyncResult.AsyncWaitHandle.WaitOne();
XmlReader reader = command.EndExecuteXmlReader(asyncResult);
XmlDocument doc = new XmlDocument();
// 将XmlReader加载到XmlDocument对象
doc.Load(reader);
output.Text = "XML : " + Server.HtmlEncode(doc.OuterXml);
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Asynchronously executing a FOR XML Query using ExecuteXmlReader </title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblID" runat="server" Text="Enter ID:"></asp:Label>
<asp:TextBox ID="txtID" runat="server"></asp:TextBox>
<asp:Button ID="btnRetrieve" runat="server" Text="Retrieve Xml" OnClick="btnRetrieve_Click" />
<br />
<br />
<br />
<asp:Literal runat="server" ID="output" />
</div>
</form>
</body>
</html>