⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 210.htm

📁 vb功能实例介绍。详细、很好的实例说明。
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<p></p>
<p>  if returnsData then </p>
<p></p>
<p>   R.Save Response, adPersistXML </p>
<p></p>
<p>   if err.number <> 0 then </p>
<p></p>
<p>     call responseError _ </p>
<p></p>
<p>     ("Recordset Save Error " & _ </p>
<p></p>
<p>     "on command 注释:" & CommandText & _ </p>
<p></p>
<p>     "注释:: " & Err.Description) </p>
<p></p>
<p>     Response.end </p>
<p></p>
<p>   end if </p>
<p></p>
<p>  ... </p>
<p></p>
<p>如果命令以输出参数返回值,页面将返回包含这些值的XML字符串。该文档的根是一个,每一个返回值对应一个子元素(参见本文可下载例程代码)。 </p>
<p>  如果产生错误,页面使用responseError子程序格式化并返回一个XML字符串。参数sDescription中包含了错误文本: </p>
<p></p>
<p>  Sub responseError(sDescription) </p>
<p></p>
<p>   Response.Write _ </p>
<p></p>
<p>     "<response><data>Error: " & sDescription & "</data></response>" </p>
<p></p>
<p>   Response.end </p>
<p></p>
<p>  End Sub </p>
<p></p>
<p>  上面的图中显示了运行中的一个实例。应用程序在左边的<div>标记里显示一个客户名列表。每个客户旁边有两个链接:Purchase History和Recent Purchase。当用户点击其中之一时,客户端程序运行一个存储过程并在右边的<div>标记里显示结果。 </p>
<p></p>
<p>  为了显示这一方案的灵活性,虽然都使用到getData.asp,但三个返回数据的操作以互不相同的方式工作。对客户列表的查询涉及到动态SQL。对Purchase History的查询运行了一个称为CustOrderHist的存储过程,它附带在Northwind数据库中,并且返回一个recordset。对Recent Purchase的查询运行了一个称为RecentPurchaseByCustomerID的存储过程,它接受一个输入参数CustomerID并在一个输出参数ProductName中返回该客户最近购买的产品的名称。过程的定义是: </p>
<p></p>
<p>  CREATE PROCEDURE RecentPurchaseByCustomerID </p>
<p></p>
<p>   @CustomerID nchar(5), </p>
<p></p>
<p>   @ProductName nchar(40) output </p>
<p></p>
<p>  AS </p>
<p></p>
<p>  SELECT @ProductName = </p>
<p></p>
<p>   (SELECT top 1 ProductName _ </p>
<p></p>
<p>   FROM Products </p>
<p></p>
<p>   INNER JOIN ([Order Details] </p>
<p></p>
<p>  INNER JOIN Orders ON_ </p>
<p></p>
<p>   Orders.OrderID=[Order_ </p>
<p></p>
<p>   Details].OrderID) </p>
<p></p>
<p>  ON Products.ProductID = </p>
<p></p>
<p>   [Order Details].ProductID </p>
<p></p>
<p>  WHERE Orders.OrderDate = </p>
<p></p>
<p>   (SELECT MAX(orders.orderdate)_ </p>
<p></p>
<p>   FROM Orders </p>
<p></p>
<p>   where CustomerID=@CustomerID) </p>
<p></p>
<p>  AND Orders.CustomerID=@CustomerID) </p>
<p></p>
<p>  GO </p>
<p></p>
<p>  无论查询中包含的是动态SQL、返回recordset的存储过程、还是在输出参数中返回值的存储过程,设置POST消息的过程差不多都完全相同。客户页面创建XML字符串<command>、创建XMLHTTPRequest对象,用Open方法将它设置为对getData.asp 页面中的URL使用POST方法、并制定对象以异步方式工作(Open方法中的False参数)。它使用Send方法发送字符串: </p>
<p></p>
<p>  set xhttp = createObject("msxml2.XMLHTTP") </p>
<p></p>
<p>  xhttp.open "POST", "http://localhost/myWeb/getData.asp", False </p>
<p></p>
<p>  xhttp.send s </p>
<p></p>
<p>  注意:在Open方法中使用的URL必须是一个完整的URL,而不是一个相对URL。换句话说,下面的代码不能工作,因为URL是不完整的: </p>
<p></p>
<p>  xhttp.open "POST", "getData.asp", False </p>
<p></p>
<p>用VB和XML建立集中式应用程序(下)</p>
<p>(作者:青苹果工作室编译 2001年03月19日 15:41)</p>
<p></p>
<p>传送消息及接收数据 </p>
<p>  客户端的XML消息由一个带有几个子元素的<command>元素构成:一个包含着存储过程名称的<commandtext>元素;一个<returnsdata> 元素,它告诉服务器客户端是否期待返回数据;返回零个还是多个包含着参数信息的<param>元素。在这个最简单的没有参数的情况下,传送的字符串查询类似于: </p>
<p></p>
<p>  <command> </p>
<p></p>
<p>   <commandtext> </p>
<p></p>
<p>     StoredProc or Dynamic SQL </p>
<p></p>
<p>   </commandtext> </p>
<p></p>
<p>   <returnsvalues>True</returnsvalues> </p>
<p></p>
<p>  </command> </p>
<p></p>
<p>  要添加参数,就需要为每一个参数添加一个<param>元素。每个<param>元素有五个子元素:<name>、<type>、<direction>、<size>和<value>。五个子元素的先后次序无关紧要,但都是必须的。通常,依照定义ADO Parameter对象所需的次序定义它们。例如,存储过程CustOrderHist需要一个CustomerID参数,所以创建传送到 detData.asp的XML字符串的代码就是: </p>
<p></p>
<p>  dim s </p>
<p></p>
<p>  s = "<?xml version=""1.0""?>" & vbcrlf </p>
<p></p>
<p>  s = s & "<command><commandtext>" </p>
<p></p>
<p>  s = s & "CustOrderHist" </p>
<p></p>
<p>  s = s & "</commandtext>" </p>
<p></p>
<p>  s = s & "<returnsdata>" & "True</returnsdata>" </p>
<p></p>
<p>  s = s & "<param>" </p>
<p></p>
<p>  s = s & "<name>CustomerID</name>" </p>
<p></p>
<p>  s = s & "<type><%=adVarChar%></type>" </p>
<p></p>
<p>  s = s & "<direction>" & "<%=adParamInput%></direction>" </p>
<p></p>
<p>  s = s & "<size>" & len(CustomerID) & "</size>" </p>
<p></p>
<p>  s = s & "<value>" & CustomerID & "</value>" </p>
<p></p>
<p>  s = s & "</param>" </p>
<p></p>
<p>  s = s & "</command>" </p>
<p></p>
<p>  注意前面的代码是在客户端的;ADO常量没有在客户端定义,这是它们必须用<% %>标记括起来的原因。在发送应答之前,服务器用正确的值替换它们。页面getData.asp有一个Response.ContentType属性,其数值为"text/xml";因此,我们就能使用ResponseXML属性查询结果。当查询返回一个记录集合时,可以创建一个Recordset对象并像以下代码那样使用XMLHTTP-Request对象的responseXML属性来打开它: </p>
<p></p>
<p>  Dim R </p>
<p></p>
<p>  set R = createObject("ADODB.Recordset") </p>
<p></p>
<p>  R.open xhttp.responseXML </p>
<p></p>
<p>  当通过输出参数返回查询数据时,可以通过将一个变量设置为XMLHTTPRequest对象的responseXML属性来创建一个DOMDocument: </p>
<p></p>
<p>  Dim xml </p>
<p></p>
<p>  set xml = xhttp.responseXML </p>
<p></p>
<p>  使用输出参数时,XML字符串包含和每个返回值相对应的一个元素。每个元素都是<values>根元素的一个子元素。例如: </p>
<p></p>
<p>  <?xml version=""1.0"" </p>
<p></p>
<p>   encoding=""ISO-8859-1""?> </p>
<p></p>
<p>  <values> </p>
<p></p>
<p>   <paramname>value</paramname> </p>
<p></p>
<p>   <paramname>value</paramname> </p>
<p></p>
<p>  </values> </p>
<p></p>
<p>  如果数据包含外语字符,就有可能需要修改encoding属性。ISO-8859-1编码能很好地支持大多数西欧语言。 </p>
<p></p>
<p>  各种情况下,客户端页面都会使用返回值来格式化一个HTML字符串,这个字符串放在屏幕右侧的div标记里的。客户端页面使用div对象的innerHTML属性来进行显示: </p>
<p></p>
<p>  document.all("details").innerHTML = </p>
<p></p>
<p>   <some formatted html string> </p>
<p></p>
<p>为不同类型的客户端服务 </p>
<p>  ASP页面让我们方便地看到应用程序到底都做了些什么,但你能用相同的技术建立使用任何技术的客户端程序。可下载代码中包含了像ASP页面一样地显示数据的Visual Basic工程文件,但是VB工程并不创建它传送到服务器上的XML字符串。相反,在启动时它通过一个称为Initialize的存储过程从服务器查询它们,这个过程简单地从叫做ClientCommands的数据表里查找这些内容。 </p>
<p></p>
<p>  数据表ClientCommands包含两个字段:command_name和command_xml字段。客户端程序接收三个特定的command_name:getCustomerList、CustOrderHist和recentPurchaseByCustomerID。这些命令的command_xml字段包含了程序发送到getData.asp页面的XML字符串,如此就集中地控制了XML字符串的格式以及存储过程的“真实”名称。在将XML字符串发送到getData.asp前,客户端程序使用XML DOM来设置存储过程的参数值。可下载的代码包含定义Initialize过程和创建并维护数据表ClientCommands的SQL代码。 </p>
<p></p>
<p>右图显示了 VB客户端程序。图中,示例程序的VB版本显示了同基于浏览器版本大致相同的信息,只不过它使用的是bound data grid控件,而不是 HTML。 </p>
<p>  示例应用程序演示了使用XHTTPRequest对象来兑现本文开头中所做的许诺。应用程序工作在能访问getData.asp的任何远程计算机内。我们能通过IIS或NTSF权限设置限制对ASP页面的访问,并且能在服务器而不是客户机上保存应用程序的全局设置。这样就避免了通过网络发送数据库的用户名和口令,而且在IE中应用程序按照需要显示数据而不是刷新整个页面。 </p>
<p></p>
<p>结语 </p>
<p>  在该应用的正式产品代码中,我们能用很多种方法使应用程序更有效。比如,我们能从ASP页面中去掉数据查询代码,并将其放到一个COM应用程序中;或者,我们还可以创建XSLT变换器以显示返回的数据。最后,通过放弃动态页面更新,并在服务器上进行XSLT变换,我们能够扩大客户端程序的应用范围。现在需要的做的,就是去尝试。 </p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -