Freigeben über


Abrufen von Resultsets in Datenströme

Statt Ergebnisse im herkömmlichen Recordset--Objekt zu empfangen, kann ADO stattdessen Abfrageergebnisse in einem Datenstrom abrufen. Das ADO Stream-Objekt (oder andere Objekte, die die COM-IStream--Schnittstelle unterstützen, z. B. die ASP Request und Response-Objekte) können verwendet werden, um diese Ergebnisse zu enthalten. Eine Verwendung für dieses Feature besteht darin, Ergebnisse im XML-Format abzurufen. Mit SQL Server können z. B. XML-Ergebnisse auf mehrere Arten zurückgegeben werden, z. B. die Verwendung der FOR XML-Klausel mit einer SQL SELECT-Abfrage oder die Verwendung einer XPath-Abfrage.

Um Abfrageergebnisse im Datenstromformat statt in einem Recordset-zu empfangen, müssen Sie die adExecuteStream- Konstante von ExecuteOptionEnum als Parameter der Execute-Methode eines Command-Objekts angeben. Wenn Ihr Anbieter dieses Feature unterstützt, werden die Ergebnisse bei der Ausführung in einem Datenstrom zurückgegeben. Möglicherweise müssen Sie zusätzliche anbieterspezifische Eigenschaften angeben, bevor der Code ausgeführt wird. Mit dem Microsoft OLE DB-Anbieter für SQL Server müssen beispielsweise Eigenschaften wie Output Stream in der Properties Auflistung des Command-Objekts angegeben werden. Weitere Informationen zu SQL Server-spezifischen dynamischen Eigenschaften im Zusammenhang mit diesem Feature finden Sie unter XML-Related Eigenschaften in den SQL Server-Onlinebüchern.

FOR XML-Abfragebeispiel

Das folgende Beispiel wird in VBScript in die Northwind-Datenbank geschrieben:

<!-- 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 -->  
  

Die FOR XML-Klausel weist SQL Server an, Daten in Form eines XML-Dokuments zurückzugeben.

FOR XML-Syntax

FOR XML [RAW|AUTO|EXPLICIT]  

FOR XML RAW generiert generische Zeilenelemente mit Spaltenwerten als Attribute. FOR XML AUTO verwendet Heuristiken, um eine hierarchische Struktur mit Elementnamen basierend auf Tabellennamen zu generieren. FOR XML EXPLICIT generiert eine universelle Tabelle mit vollständig durch Metadaten beschriebenen Beziehungen.

Ein Beispiel für eine SQL SELECT FOR XML-Anweisung:

SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO  

Der Befehl kann wie zuvor gezeigt in einer Zeichenfolge angegeben werden, die CommandText-zugewiesen ist, oder in Form einer XML-Vorlagenabfrage, die CommandStream-zugewiesen ist. Weitere Informationen zu XML-Vorlagenabfragen finden Sie unter Command Streams in ADO oder Using Streams for Command Input in the SQL Server Books Online.

Als XML-Vorlagenabfrage wird die FOR XML-Abfrage wie folgt angezeigt:

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

In diesem Beispiel wird das ASP Response-Objekt für die eigenschaft Output Stream angegeben:

adoCmd.Properties("Output Stream") = Response  

Geben Sie als Nächstes den Parameter adExecuteStream von Executean. In diesem Beispiel wird der Datenstrom in XML-Tags umbrochen, um eine XML-Dateninsel zu erstellen:

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

Bemerkungen

An diesem Punkt wurde XML an den Clientbrowser gestreamt und kann angezeigt werden. Dazu wird clientseitiges VBScript verwendet, um das XML-Dokument an eine Instanz des DOM zu binden und eine Schleife über jeden untergeordneten Knoten durchzuführen, um eine Liste der Produkte in HTML zu erstellen.