ストリームへの結果セットの取得
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 では、コマンド オブジェクトの Properties コレクション内の Output Stream などのプロパティを指定する必要があります。 この機能に関連する SQL Server 固有の動的プロパティの詳細については、「SQL Server オンライン ブックの XML-Related プロパティ」を参照してください。
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 句は、XML ドキュメントの形式でデータを返すように SQL Server に指示します。
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に割り当てるか、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 で Products のリストを作成します。