Recupero di set di risultati nei flussi

Anziché ricevere i risultati nell'oggetto Recordset tradizionale, ADO può recuperare i risultati delle query in un flusso. L'oggetto ADO Stream o altri oggetti che supportano l'interfaccia COM IStream come gli oggetti ASP Request e Response, possono essere usati per includere questi risultati. Un uso di questa funzionalità consiste nel recuperare i risultati in formato XML. Con SQL Server, ad esempio, i risultati XML possono essere restituiti in più modi, ad esempio usando la clausola FOR XML con una query SQL SELECT o usando una query XPath.

Per ricevere i risultati delle query in formato flusso anziché in un oggetto Recordset, è necessario specificare la costante adExecuteStream di ExecuteOptionEnum come parametro del metodo Execute di un oggetto Command. Se il provider supporta questa funzionalità, i risultati verranno restituiti in un flusso al momento dell'esecuzione. Potrebbe essere necessario specificare ulteriori proprietà specifiche del provider prima dell'esecuzione del codice. Ad esempio, con il provider Microsoft OLE DB per SQL Server, è necessario specificare proprietà come Output Stream nella raccolta Properties dell'oggetto Command. Per altre informazioni sulle proprietà dinamiche specifiche di SQL Server correlate a questa funzionalità, vedere Proprietà correlate a XML nella documentazione online di SQL Server.

Esempio di query FOR XML

L'esempio seguente è scritto in VBScript nel database 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 clausola FOR XML indica a SQL Server di restituire i dati sotto forma di documento XML.

Sintassi FOR XML

FOR XML [RAW|AUTO|EXPLICIT]  

FOR XML RAW genera elementi di riga generici con valori di colonna come attributi. FOR XML AUTO usa l'euristica per generare un albero gerarchico con nomi di elemento basati sui nomi di tabella. FOR XML EXPLICIT genera una tabella universale con relazioni completamente descritte dai metadati.

Segue un esempio di istruzione SQL SELECT FOR XML:

SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO  

Il comando può essere specificato in una stringa come illustrato in precedenza, assegnato a CommandText o sotto forma di una query modello XML assegnata a CommandStream. Per altre informazioni sulle query di modello XML, vedere Flussi di comando in ADO o Uso di flussi per l'input dei comandi nella documentazione online di SQL Server.

Come query modello XML, la query FOR XML risulterà come segue:

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

In questo esempio viene specificato l'oggetto ASP Risposta per la proprietà Output Stream:

adoCmd.Properties("Output Stream") = Response  

Specificare quindi il parametro adExecuteStream di Execute. Questo esempio esegue il wrapping del flusso in tag XML per creare un'isola di dati XML:

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

Osservazioni:

A questo punto, il codice XML è stato trasmesso al browser client ed è pronto per essere visualizzato. Questa operazione viene eseguita usando VBScript lato client per associare il documento XML a un'istanza di DOM e scorrendo ogni nodo figlio per creare un elenco di prodotti in HTML.