將結果集擷取為資料流
ADO 可以改為將查詢結果擷取到資料流,而不是在傳統 Recordset 物件中接收結果。 可以使用 ADO Stream 物件 (或支援 COM IStream 介面的其他物件,例如 ASP Request 和 Response 物件) 來包含這些結果。 這項功能的其中一個用途是擷取 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
接著會指定 Execute 的 adExecuteStream 參數。 此範例會將資料流包裝在 XML 標籤中,以建立 XML 資料島:
Response.write "<XML ID=MyDataIsle>"
adoCmd.Execute , , adExecuteStream
Response.write "</XML>"
備註
此時,XML 已串流至用戶端瀏覽器,並且準備好顯示。 若要完成此動作,需使用用戶端 VBScript 將 XML 文件繫結至 DOM 的執行個體,並重複查看每個子節點,以便在 HTML 中組建 Products 清單。