스트림으로 결과 집합 검색

기존 Recordset 개체에서 결과를 받는 대신 ADO는 쿼리 결과를 스트림으로 검색할 수 있습니다. ADO Stream 개체(또는 ASP RequestResponse 개체와 같은 COM IStream 인터페이스를 지원하는 다른 개체)를 사용하여 이러한 결과를 포함시킬 수 있습니다. 이 기능의 한 가지 용도는 결과를 XML 형식으로 검색하는 것입니다. 예를 들어 SQL Server를 사용하면 SQL SELECT 쿼리와 함께 FOR XML 절을 사용하거나 XPath 쿼리를 사용하는 등 여러 가지 방법으로 XML 결과를 반환할 수 있습니다.

Recordset 대신 스트림 형식으로 쿼리 결과를 받으려면 ExecuteOptionEnumadExecuteStream 상수를 Command 개체의 Execute 메서드의 매개 변수로 지정해야 합니다. 공급자가 이 기능을 지원하는 경우 실행 시 결과가 스트림에 반환됩니다. 코드가 실행되기 전에 추가 공급자별 속성을 지정해야 할 수 있습니다. 예를 들어 SQL Server용 Microsoft OLE DB 공급자를 사용하여 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 절은 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에 할당하거나 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로 제품 목록을 작성합니다.