检索流中的结果集
ADO 可以将查询结果检索到一个流中,而不是在传统 Recordset 对象中接收结果。 可使用 ADO IStream 对象(或支持 COM IStream 接口的其他对象,例如,ASP Request 和 Response 对象)包含这些结果。 此功能的一个用途是以 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 相关属性”。
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 模板查询的详细信息,请参阅 SQL Server 联机丛书中的“ADO 中的命令流”或“使用流进行命令输入”。
作为 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 中的产品列表来完成的。