스트림으로 결과 집합 검색
기존 Recordset 개체에서 결과를 받는 대신 ADO는 쿼리 결과를 스트림으로 검색할 수 있습니다. ADO Stream 개체(또는 ASP Request 및 Response 개체와 같은 COM IStream 인터페이스를 지원하는 다른 개체)를 사용하여 이러한 결과를 포함시킬 수 있습니다. 이 기능의 한 가지 용도는 결과를 XML 형식으로 검색하는 것입니다. 예를 들어 SQL Server를 사용하면 SQL SELECT 쿼리와 함께 FOR XML 절을 사용하거나 XPath 쿼리를 사용하는 등 여러 가지 방법으로 XML 결과를 반환할 수 있습니다.
Recordset 대신 스트림 형식으로 쿼리 결과를 받으려면 ExecuteOptionEnum의 adExecuteStream 상수를 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
다음으로 Execute의 adExecuteStream 매개 변수를 지정합니다. 다음은 XML 태그로 스트림을 래핑하여 XML 데이터 아일랜드를 만드는 예제입니다.
Response.write "<XML ID=MyDataIsle>"
adoCmd.Execute , , adExecuteStream
Response.write "</XML>"
설명
이 시점에서 XML은 클라이언트 브라우저로 스트리밍되었으며 표시할 준비가 되었습니다. 이렇게 하려면 클라이언트 쪽 VBScript를 사용하여 XML 문서를 DOM 인스턴스에 바인딩하고 각 자식 노드를 반복하여 HTML로 제품 목록을 작성합니다.