首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2000 XML 輸出技巧:ADO Stream 物件正確接收 FOR XML 結果

     編輯:關於SqlServer

問題背景

SQL Server 2000 `FOR XML` 子句可直接將查詢結果序列化為 XML。但使用傳統 ADO `Recordset` 接收時,只能取得 Unicode XML Schema,無法獲得實際 XML 內容。正確做法是使用 `Stream` 物件。

核心原理

  • `Command` 物件提供 `Input Stream` / `Output Stream` 屬性 (型別 `IUnknown`)。
  • 將 `Response` (ASP)、`XMLDOM`、`FileStream` 等實作 `IStream` 的物件指派給 `Output Stream`。
  • 執行時 `adExecuteStream` 選項指示引擎直接寫入流,避免中間 `Recordset` 物件建立與資料複製,降低記憶體與 CPU 開銷。

ASP/VBScript 完整範例:直接輸出 XML 至 HTTP 回應

<%@ 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
%>

其他常見 Stream 目標

目標用途程式碼片段
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`

進階屬性

  • `XML Root`:指定根元素名稱 (預設無根元素,可能非 well-formed)。
  • `XSL`:指定 XSLT 樣式表直接轉換輸出 HTML/其他格式。
  • `Base Path`:相對路徑解析基準 (配合 `XSL`)。

遷移至 ADO.NET / SqlClient (現代做法)

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
    }
}

優勢: 托管程式碼、連線池、非同步支援、參數化查詢、更佳效能與安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved