欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用ASP、VB和XML建立互联网应用程序(3)

程序员文章站 2022-07-02 18:52:54
假设在我们前面所说的例子中,我们想在应用程序中显示区域的左半边显示客户的姓名列表,再在每个客户姓名后面加上两个链接:purchase history和recent purchase。当用户点击其中的...
假设在我们前面所说的例子中,我们想在应用程序中显示区域的左半边显示客户的姓名列表,再在每个客户姓名后面加上两个链接:purchase history和recent purchase。当用户点击其中的一个链接,客户程序就会运行一个存储过程并在右边区域显示出结果。 为了显示这个想法的灵活性,我想让用于返回数据的三个操作单元执行不同的工作过程,它们都调用getdata.。首先,通过调用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 ("msxml(标准化越来越近了)2.xml(标准化越来越近了)http")
  xhttp.open "post", "https://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对象并且使用xml(标准化越来越近了)http来打开它:

  dim r
   set r = createobject("adodb.recordset")
   r.open xhttp.responsexml(标准化越来越近了)

  当查询语句返回数据时,通过设置xml(标准化越来越近了)httprequest对象的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