ストリーム形式で結果セットを取得する

ADO では、従来の Recordset オブジェクトで結果を受け取るのではなく、代わりにクエリ結果をストリーム形式で取得できます。 ADO Stream オブジェクト (または ASP RequestResponse オブジェクトなどの、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 関連のプロパティを参照してください。

FOR 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 構文

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  

次に、ExecuteadExecuteStream パラメーターを指定します。 この例では、XML タグでストリームをラップして XML データ アイランドを作成します。

Response.write "<XML ID=MyDataIsle>"  
adoCmd.Execute , , adExecuteStream  
Response.write "</XML>"  

注釈

この時点で、XML はクライアント ブラウザーにストリーミングされており、表示する準備が整っています。 これを行うには、クライアント側の VBScript を使用して XML ドキュメントを DOM のインスタンスにバインドし、各子ノードをループして HTML で製品の一覧を作成します。