SQL Server 2000 的 FOR XML 子句可輕易將查詢結果轉為 XML,但搭配 ADO 2.6+ 讀取時,傳統 Recordset 只能取得 XML Schema,無法取得實際 XML 內容。關鍵在於使用 Command 物件的 Output Stream 屬性,直接將 XML 串流輸出至 Response 或 Stream 物件,避免中間 Recordset 開銷。
Command 物件具備 Input Stream 與 Output Stream 屬性 (型別為 IUnknown)Request、Response 等支援 Stream 的物件<%@ Language=VBScript %>
<!-- #include file="ADOVBS.inc" -->
<%
Dim objConn, objCmd, i
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=PBA;Data Source=(local)"
Set objCmd = Server.CreateObject("ADODB.Command")
objCmd.ActiveConnection = objConn
objCmd.Properties("Output Stream") = Response ' 關鍵:直接串流到 HTTP 回應
objCmd.Properties("XML Root") = "root" ' 根元素名稱
objCmd.CommandText = "SELECT * FROM UserStatus FOR XML AUTO"
Response.ContentType = "text/xml" ' 設定 MIME 型別
objCmd.Execute i, , adExecuteStream ' 串流執行模式
Set objCmd = Nothing
objConn.Close
Set objConn = Nothing
%>
| 屬性 | 用途 | 備註 |
|---|---|---|
| Output Stream | 指定 XML 輸出目的地 | Response、Stream、檔案物件皆可 |
| XML Root | 指定 XML 文件根元素名稱 | FOR XML AUTO/RAW 需此屬性產生合法 XML |
| adExecuteStream | 執行選項常數 | 告知 ADO 以 Stream 模式執行 |
Output Stream = Server.CreateObject("ADODB.Stream") 存檔後 Response.BinaryWriteMSXML2.DOMDocument 再套用樣式表FOR XML EXPLICIT 控制結構,避免記憶體暴增Output Stream,或未使用 adExecuteStreamResponse.CodePage = 65001 (UTF-8) 或 950 (Big5),資料庫排序規則一致SELECT 權限與 FOR XML 執行權限SQL Server 2005+ 引入原生 xml 資料型別、FOR XML PATH、XQuery 支援,配合 ADO.NET XmlReader 處理更靈活。新專案建議直接採用新架構。