將結果集擷取至數據流
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 格式中生成產品清單來完成的。