Partilhar via


Recuperar conjuntos de resultados em fluxos

Em vez de receber os resultados no objeto Recordset tradicional, o ADO pode recuperar os resultados da consulta em um fluxo. O objeto Stream do ADO (ou os outros objetos que dão suporte à interface COM IStream, como os objetos ASP Request e Response) pode ser usado para conter esses resultados. Um uso para esse recurso é recuperar os resultados no formato XML. Com o SQL Server, por exemplo, os resultados XML podem ser retornados de várias maneiras, como o uso da cláusula FOR XML com uma consulta SQL SELECT ou o uso de uma consulta XPath.

Para receber os resultados da consulta no formato de fluxo em vez de em um Recordset, você precisa especificar a constante adExecuteStream de ExecuteOptionEnum como um parâmetro do método Execute de um objeto Command. Se o provedor der suporte a esse recurso, os resultados serão retornados em um fluxo após a execução. Talvez seja necessário especificar propriedades adicionais específicas do provedor antes que o código seja executado. Por exemplo, com o Provedor Microsoft OLE DB para SQL Server, propriedades como Output Stream na coleção Properties do objeto Command precisam ser especificadas. Para obter mais informações sobre as propriedades dinâmicas específicas do SQL Server relacionadas a esse recurso, confira Propriedades relacionadas ao XML nos Manuais Online do SQL Server.

Exemplo de consulta FOR XML

O seguinte exemplo foi escrito em VBScript no banco de dados Northwind:

<!-- BeginRecordAndStreamVBS -->  
<%@ LANGUAGE = VBScript %>  
<%  Option Explicit      %>  
  
<HTML>  
<HEAD>  
<META NAME="GENERATOR" Content="Microsoft Developer Studio"/>  
<META HTTP-EQUIV="Content-Type" content="text/html"; charset="iso-8859-1">  
<TITLE>FOR XML Query Example</TITLE>  
  
<STYLE>  
   BODY  
   {  
      FONT-FAMILY: Tahoma;  
      FONT-SIZE: 8pt;  
      OVERFLOW: auto  
   }  
  
   H3  
   {  
      FONT-FAMILY: Tahoma;  
      FONT-SIZE: 8pt;  
      OVERFLOW: auto  
   }  
</STYLE>  
  
<!-- #include file="adovbs.inc" -->  
<%  
   Response.Write "<H3>Server-side processing</H3>"  
  
   Response.Write "Page Generated @ " & Now() & "<BR/>"  
  
   Dim adoConn  
   Set adoConn = Server.CreateObject("ADODB.Connection")  
  
   Dim sConn  
   sConn = "Provider=SQLOLEDB;Data Source=" & _  
      Request.ServerVariables("SERVER_NAME") & ";" & _  
      Initial Catalog=Northwind;Integrated Security=SSPI;"  
  
   Response.write "Connect String = " & sConn & "<BR/>"  
  
   adoConn.ConnectionString = sConn  
   adoConn.CursorLocation = adUseClient  
  
   adoConn.Open  
  
   Response.write "ADO Version = " & adoConn.Version & "<BR/>"  
   Response.write "adoConn.State = " & adoConn.State & "<BR/>"  
  
   Dim adoCmd  
   Set adoCmd = Server.CreateObject("ADODB.Command")  
   Set adoCmd.ActiveConnection = adoConn  
  
   Dim sQuery  
   sQuery = "<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'><sql:query>SELECT * FROM PRODUCTS WHERE ProductName='Gumbr Gummibrchen' FOR XML AUTO</sql:query></ROOT>"  
  
   Response.write "Query String = " & sQuery & "<BR/>"  
  
   Dim adoStreamQuery  
   Set adoStreamQuery = Server.CreateObject("ADODB.Stream")  
   adoStreamQuery.Open  
   adoStreamQuery.WriteText sQuery, adWriteChar  
   adoStreamQuery.Position = 0  
  
   adoCmd.CommandStream = adoStreamQuery  
   adoCmd.Dialect = "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"  
  
   Response.write "Pushing XML to client for processing "  & "<BR/>"  
  
   adoCmd.Properties("Output Stream") = Response  
   Response.write "<XML ID='MyDataIsle'>"  
   adoCmd.Execute , , 1024  
   Response.write "</XML>"  
  
%>  
  
<SCRIPT language="VBScript" For="window" Event="onload">  
   Dim xmlDoc  
   Set xmlDoc = MyDataIsle.XMLDocument  
   xmlDoc.resolveExternals=false  
   xmlDoc.async=false  
  
   If xmlDoc.parseError.Reason <> "" then  
      Msgbox "parseError.Reason = " & xmlDoc.parseError.Reason  
   End If  
  
   Dim root, child  
   Set root = xmlDoc.documentElement  
   For each child in root.childNodes  
      dim OutputXML  
      OutputXML = document.all("log").innerHTML  
      document.all("log").innerHTML = OutputXML & "<LI>" & child.getAttribute("ProductName") & "</LI>"  
   Next  
</SCRIPT>  
  
</HEAD>  
  
<BODY>  
  
   <H3>Client-side processing of XML Document MyDataIsle</H3>  
   <UL id=log>  
   </UL>  
  
</BODY>  
</HTML>  
<!-- EndRecordAndStreamVBS -->  
  

A cláusula FOR XML instrui o SQL Server a retornar os dados no formato de um documento XML.

Sintaxe de FOR XML

FOR XML [RAW|AUTO|EXPLICIT]  

FOR XML RAW gera elementos de linha genéricos que têm valores de coluna como atributos. FOR XML AUTO usa a heurística para gerar uma árvore hierárquica com os nomes de elementos baseados em nomes de tabelas. FOR XML EXPLICIT gera uma tabela universal com as relações totalmente descritas por metadados.

Veja um exemplo de instrução SQL SELECT FOR XML:

SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO  

O comando pode ser especificado em uma cadeia de caracteres, conforme mostrado anteriormente, atribuído ao CommandText ou na forma de uma consulta de modelo XML atribuída ao CommandStream. Para obter mais informações sobre as consultas de modelo XML, confira Fluxos de comando no ADO ou Como usar fluxos para a entrada de comandos nos Manuais Online do SQL Server.

Como uma consulta de modelo XML, a consulta FOR XML é exibida da seguinte maneira:

<sql:query> SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO </sql:query>  

Este exemplo especifica o objeto ASP Response para a propriedade Output Stream:

adoCmd.Properties("Output Stream") = Response  

Em seguida, especifique o parâmetro adExecuteStream de Execute. Este exemplo encapsula o fluxo em marcas XML para criar uma ilha de dados XML:

Response.write "<XML ID=MyDataIsle>"  
adoCmd.Execute , , adExecuteStream  
Response.write "</XML>"  

Comentários

Neste ponto, o XML foi transmitido para o navegador cliente e está pronto para ser exibido. Isso é feito com o VBScript do lado do cliente para associar o documento XML a uma instância do DOM e com um loop por meio de cada nó filho para criar uma lista de produtos em HTML.