<<<返回

用ASP、VB和XML建立互联网应用程序(3)
假设在我们前面所说的例子中，我们想在应用程序中显示区域的左半边显示客户的姓名列表，再在每个客户姓名后面加上两个链接：Purchase History和Recent Purchase。当用户点击其中的一个链接，客户程序就会运行一个存储过程并在右边区域显示出结果。 为了显示这个想法的灵活性，我想让用于返回数据的三个操作单元执行不同的工作过程，它们都调用getData.asp。首先，通过调用CustOrderHist来运行一个存储过程，返回客户的Purchase History，它搜索Northwind数据库（为了方便起见我使用MS SQL中自带的数据库）并返回一个数据集。用于返回Recent Purchase 的查询语句运行一个叫RecentPurchaseByCustomerID的存储过程，来接收输入的CustomerID参数并通过ProductName参数返回最近顾客购买的商品名。定义其处理过程相应SQL语句如下：
CREATE PROCEDURE RecentPurchaseByCustomerID @CustomerID nchar(5), @ProductName nchar(40) output AS SELECT @ProductName = (SELECT top 1 ProductName FROM Products INNER JOIN ([Order Details] INNER JOIN Orders ON Orders.OrderID=[Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID WHERE Orders.OrderDate = (SELECT MAX(orders.orderdate) FROM Orders
where CustomerID=@CustomerID) AND Orders.CustomerID=@CustomerID) GO
不管你的查询语句中含有动态SQL语句还是含有返回记录集的存储过程或是输出一个返回值，其处理POST消息的方法是一样的：
set xhttp = createObject ("msxml2.XMLHTTP")
xhttp.open "POST", "http://localhost/myWeb/ getData.asp", False
xhttp.send s
好了，现在让我们看一看如何发送和接收数据
客户端的XML信息是由一个＜command＞元素和一些子元素组成：＜commandtext＞元素包含了存储过程的名称，＜returnsdata＞元素告诉服务器，客户端是否要求接收返回数据，＜param＞元素包含参数信息。如果不使用参数的话，那么最简单的发送字符串查询就象下面这样：
＜command＞
＜commandtext＞
存储过程或动态SQL语句
＜/commandtext＞
＜returnsvalues＞True＜/returnsvalues＞
＜/command＞
你可以为每一个参数使用一个＜param＞元素，来添加参数。每个＜param＞元素有五个子元素：name，type，direction，size和value。子元素的顺序可以随意调换，但是所有的元素都应当有不能缺少，我通常按照定义一个ADO对象的值的顺序来定义它们。举例来说，CustOrderHist存储过程需要一个CustomID参数，所以用来创建发送到getData.asp的XML字符串的代码为：
dim s
s = "＜?xml version=""1.0""?＞" & vbcrlf
s = s & "＜command＞＜commandtext＞"
s = s & "CustOrderHist"
s = s & "＜/commandtext＞"
s = s & "＜returnsdata＞" &True＜/returnsdata＞"
s = s & "＜param＞"
s = s & "＜name＞CustomerID＜/name＞"
s = s & "＜type＞＜%=adVarChar%＞＜/type＞"
s = s & "＜direction＞" & ＜%=adParamInput%＞＜/direction＞"
s = s & "＜size＞" & len(CustomerID)& "＜/size＞"
s = s & "＜value＞" & CustomerID &"＜/value＞"
s = s & "＜/param＞"
s = s & "＜/command＞"
注意，前面的代码都是客户端代码，ADO常量是不在客户端定义的-这就是它们为什么使用＜% %＞标记围起来的原因。服务器在发送响应之前使用正确的值取代它们。getData.asp页有一个Response.ContentType，它的属性为"text/xml",这样，你就可以使用ResponseXML属性来返回结果了。当请求返回纪录，你就可以创建一个Recordset对象并且使用XMLHTTP来打开它：
Dim R
set R = createObject("ADODB.Recordset")
R.open xhttp.responseXML
当查询语句返回数据时，通过设置XMLHTTPRequest对象的responseXML属性来创建一个DOMDocument：
Dim xml
set xml = xhttp.responseXML
输出参数的XML字符串的每个返回值都包含一个元素，它们都是根元素＜values＞的直接子元素，例如：
＜?xml version=""1.0"" encoding=""gb2312""?＞
＜values＞
＜paramname＞value＜/paramname＞
＜paramname＞value＜/paramname＞
＜/values＞
如果你的数据使用别的国家的文字，你可能需要把编码属性用相应的编码替换，例如对于大部分欧洲语言，可以使用ISO-8859-1
客户端页面使用返回的数据来格式化一个HTML字符串用于显示，如：
document.all("details").innerHTML = ＜一些格式化的HTML字符串＞