共用方式為


將結果集擷取至數據流

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

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

adoCmd.Properties("Output Stream") = Response  

接下來,指定 Execute的 adExecuteStream 參數。 此範例會將數據流包裝在 XML 標籤中,以建立 XML 資料島:

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

備註

此時,XML 已串流至用戶端瀏覽器,且已準備好顯示。 這是通過使用用戶端 VBScript 將 XML 文件綁定到 DOM 實例,然後迴圈遍歷每個子節點,以在 HTML 格式中生成產品清單來完成的。