ストリーム形式で結果セットを取得する
ADO では、従来の Recordset オブジェクトで結果を受け取るのではなく、代わりにクエリ結果をストリーム形式で取得できます。 ADO Stream オブジェクト (または ASP Request や Response オブジェクトなどの、COM IStream インターフェイスをサポートする他のオブジェクト) を使用して、これらの結果を含めることができます。 この機能の 1 つの用途は、XML 形式で結果を取得することです。 たとえば、SQL Server では、SQL SELECT クエリでの FOR XML 句の使用や XPath クエリの使用など、複数の方法で XML 結果を返すことができます。
Recordset ではなくストリーム形式でクエリ結果を受け取るには、Command オブジェクトの Execute メソッドのパラメーターとして ExecuteOptionEnum から adExecuteStream 定数を指定する必要があります。 プロバイダーでこの機能がサポートされている場合、実行時にストリーム形式で結果が返されます。 コードを実行する前に、追加のプロバイダー固有のプロパティを指定する必要がある場合があります。 たとえば、Microsoft OLE DB Provider for SQL Server では、Command オブジェクトの Properties コレクション内の Output Stream などのプロパティを指定する必要があります。 この機能に関連する SQL Server 固有の動的プロパティの詳細については、SQL Server オンライン ブックの XML 関連のプロパティを参照してください。
次の例は、Northwind データベースに VBScript で記述されています。
<!-- 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 句は、XML ドキュメントの形式でデータを返すように SQL Server に示します。
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 に割り当てたり、CommandStream に割り当てられた XML テンプレート クエリの形式で指定することもできます。 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 で製品の一覧を作成します。