SQL Server 2000 `FOR XML` 子句可直接將查詢結果序列化為 XML。但使用傳統 ADO `Recordset` 接收時,只能取得 Unicode XML Schema,無法獲得實際 XML 內容。正確做法是使用 `Stream` 物件。
<%@ Language=VBScript %>
<!-- #include file="ADOVBS.inc" -->
<%
Dim objConn, objCmd, lngRowsAffected
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"
objCmd.Execute lngRowsAffected, , adExecuteStream ' 關鍵:adExecuteStream
Set objCmd = Nothing
objConn.Close
Set objConn = Nothing
%>
| 目標 | 用途 | 程式碼片段 |
|---|---|---|
| XMLDOM 物件 | 記憶體中操作 XML (XPath、XSLT) | `Set dom = CreateObject("MSXML2.DOMDocument.6.0")` `objCmd.Properties("Output Stream") = dom` |
| 檔案串流 | 直接存檔避免記憶體壓力 | `Set fs = CreateObject("ADODB.Stream")` `fs.Type = adTypeText` `fs.Open` `objCmd.Properties("Output Stream") = fs` `fs.SaveToFile "C:\out.xml", adSaveCreateOverWrite` |
| 字串變數 | 取得 XML 字串進一步處理 | `Set fs = CreateObject("ADODB.Stream")` `fs.Type = adTypeText; fs.Open; fs.Charset = "utf-8"` `objCmd.Properties("Output Stream") = fs` `xmlStr = fs.ReadText` |
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand("SELECT * FROM UserStatus FOR XML AUTO, ROOT('root')", conn))
{
conn.Open();
using (var reader = cmd.ExecuteXmlReader())
{
var doc = new XmlDocument();
doc.Load(reader); // 或直接寫入 HttpResponse.OutputStream
}
}
優勢: 托管程式碼、連線池、非同步支援、參數化查詢、更佳效能與安全性。