Partager via


Récupération de jeux de résultats dans les flux

Au lieu de recevoir des résultats dans l’objet Recordset traditionnel, ADO peut plutôt récupérer les résultats de requête dans un flux. L'objet ADO Flux (ou d'autres objets prenant en charge l'interface COM IStream, tels que les objets ASP Requête et Réponse) peut être utilisé pour contenir ces résultats. Une utilisation pour cette fonctionnalité consiste à récupérer les résultats au format XML. Avec SQL Server, par exemple, les résultats XML peuvent être retournés de plusieurs manières, telles que l’utilisation de la clause FOR XML avec une requête SQL SELECT ou l’utilisation d’une requête XPath.

Pour recevoir des résultats de requête au format de flux au lieu d’un jeu d’enregistrements, vous devez spécifier la constante adExecuteStream de ExecuteOptionEnum en tant que paramètre de la méthode Execute d’un objet Command . Si votre fournisseur prend en charge cette fonctionnalité, les résultats sont retournés dans un flux lors de l’exécution. Vous devrez peut-être spécifier des propriétés spécifiques au fournisseur supplémentaires avant l’exécution du code. Par exemple, avec le fournisseur Microsoft OLE DB pour SQL Server, les propriétés telles que Output Stream dans la collection Propriétés de l’objet Commande doivent être spécifiées. Pour plus d’informations sur les propriétés dynamiques spécifiques à SQL Server liées à cette fonctionnalité, consultez XML-Related Propriétés dans la documentation en ligne SQL Server.

Exemple de requête FOR XML

L'exemple suivant est écrit en VBScript dans la base de données 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 -->  
  

La clause FOR XML indique SQL Server retourner des données sous la forme d’un document XML.

Syntaxe FOR XML

FOR XML [RAW|AUTO|EXPLICIT]  

FOR XML RAW génère des éléments de ligne génériques qui ont des valeurs de colonne en tant qu’attributs. FOR XML AUTO utilise des heuristiques pour générer une arborescence hiérarchique avec des noms d’éléments basés sur les noms de table. FOR XML EXPLICIT génère une table universelle avec des relations entièrement décrites par les métadonnées.

Voici un exemple d’instruction SQL SELECT FOR XML :

SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO  

La commande peut être spécifiée dans une chaîne comme indiqué précédemment, affectée à CommandText ou sous la forme d’une requête de modèle XML affectée à CommandStream. Pour plus d’informations sur les requêtes de modèle XML, consultez Flux de commandes dans ADO ou Utilisation de flux pour l’entrée de commande dans la SQL Server documentation en ligne.

En tant que requête de modèle XML, la requête FOR XML s’affiche comme suit :

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

Cet exemple spécifie l’objet Asp Response pour la propriété Output Stream :

adoCmd.Properties("Output Stream") = Response  

Ensuite, spécifiez le paramètre adExecuteStreamd’Execute. Cet exemple montre comment encapsuler le flux dans les balises XML pour créer un îlot de données XML :

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

Notes

À ce stade, XML a été diffusé en continu vers le navigateur client et il est prêt à être affiché. Pour ce faire, utilisez VBScript côté client pour lier le document XML à une instance du DOM et parcourir chaque nœud enfant pour créer une liste de produits en HTML.