將結果集擷取為資料流

ADO 可以改為將查詢結果擷取到資料流,而不是在傳統 Recordset 物件中接收結果。 可以使用 ADO Stream 物件 (或支援 COM IStream 介面的其他物件,例如 ASP RequestResponse 物件) 來包含這些結果。 這項功能的其中一個用途是擷取 XML 格式的結果。 例如,使用 SQL Server 時,可以透過多種方式傳回 XML 結果,例如搭配 SQL SELECT 查詢使用 FOR XML 子句,或是使用 XPath 查詢。

若要以資料流格式 (而非 Recordset) 接收查詢結果,您必須將 ExecuteOptionEnum 中的 adExecuteStream 常數指定為 Command 物件的 Execute 方法之參數。 如果您的提供者支援這項功能,則執行時會在資料流中傳回結果。 在程式碼執行之前,可能需要指定其他提供者特定的屬性。 例如,使用 Microsoft OLE DB Provider for SQL Server 時,必須指定 Command 物件 Properties 集合中的 Output Stream 等屬性。 如需與此功能有關的 SQL Server 特定動態屬性之詳細資訊,請參閱 SQL Server 線上叢書中的 XML-Related 屬性。

FOR XML 查詢範例

下列範例會以 VBScript 寫入 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 -->  
  

FOR XML 子句會指示 SQL Server 以 XML 文件的形式傳回資料。

FOR XML 語法

FOR XML [RAW|AUTO|EXPLICIT]  

FOR XML RAW 會產生以資料行值作為屬性的泛型資料列元素。 FOR XML AUTO 會使用啟發學習法來產生以資料表名稱為基礎之元素名稱的階層式樹狀結構。 FOR XML EXPLICIT 會產生通用資料表,表中會包含中繼資料完整描述的關聯性。

SQL SELECT FOR XML 陳述式的範例如下:

SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO  

命令可以在字串中指定 (如先前所示)、指派給 CommandText,或是以 XML 範本查詢的形式指派給 CommandStream。 如需 XML 範本查詢的詳細資訊,請參閱 ADO 中的命令資料流,或是 SQL Server 線上叢書中的「使用命令輸入的資料流」。

作為 XML 範本查詢,FOR XML 查詢如下所示:

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

此範例會指定 Output Stream 屬性的 ASP Response 物件:

adoCmd.Properties("Output Stream") = Response  

接著會指定 ExecuteadExecuteStream 參數。 此範例會將資料流包裝在 XML 標籤中,以建立 XML 資料島:

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

備註

此時,XML 已串流至用戶端瀏覽器,並且準備好顯示。 若要完成此動作,需使用用戶端 VBScript 將 XML 文件繫結至 DOM 的執行個體,並重複查看每個子節點,以便在 HTML 中組建 Products 清單。