Mengambil Resultsets ke Streams

Alih-alih menerima hasil dalam objek Recordset tradisional, ADO dapat mengambil hasil kueri ke dalam aliran. Objek ADO Stream (atau objek lain yang mendukung antarmuka COM IStream , seperti objek Permintaan dan Respons ASP) dapat digunakan untuk memuat hasil ini. Salah satu penggunaan untuk fitur ini adalah mengambil hasil dalam format XML. Dengan SQL Server, misalnya, hasil XML dapat dikembalikan dalam beberapa cara, seperti menggunakan klausa FOR XML dengan kueri SQL SELECT atau menggunakan kueri JalurX.

Untuk menerima hasil kueri dalam format aliran alih-alih dalam Recordset, Anda harus menentukan konstanta adExecuteStream dari ExecuteOptionEnum sebagai parameter metode Execute dari objek Perintah . Jika penyedia Anda mendukung fitur ini, hasilnya akan dikembalikan dalam aliran setelah eksekusi. Anda mungkin diharuskan untuk menentukan properti khusus penyedia tambahan sebelum kode dijalankan. Misalnya, dengan Penyedia Microsoft OLE DB untuk SQL Server, properti seperti Aliran Output dalam kumpulan Properti objek Perintah harus ditentukan. Untuk informasi selengkapnya tentang properti dinamis khusus SQL Server yang terkait dengan fitur ini, lihat properti XML-Related di SQL Server Books Online.

Untuk Contoh Kueri XML

Contoh berikut ditulis dalam VBScript ke database 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 -->  
  

Klausa FOR XML menginstruksikan SQL Server untuk mengembalikan data dalam bentuk dokumen XML.

Untuk Sintaks XML

FOR XML [RAW|AUTO|EXPLICIT]  

FOR XML RAW menghasilkan elemen baris generik yang memiliki nilai kolom sebagai atribut. UNTUK XML AUTO menggunakan heuristik untuk menghasilkan pohon hierarkis dengan nama elemen berdasarkan nama tabel. UNTUK XML EXPLICIT menghasilkan tabel universal dengan hubungan yang sepenuhnya dijelaskan oleh metadata.

Contoh pernyataan SQL SELECT FOR XML berikut:

SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO  

Perintah dapat ditentukan dalam string seperti yang ditunjukkan sebelumnya, ditetapkan ke CommandText, atau dalam bentuk kueri templat XML yang ditetapkan ke CommandStream. Untuk informasi selengkapnya tentang kueri templat XML, lihat Aliran Perintah di ADO atau Menggunakan Stream untuk Input Perintah di SQL Server Books Online.

Sebagai kueri templat XML, kueri FOR XML muncul sebagai berikut:

<sql:query> SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO </sql:query>  

Contoh ini menentukan objek Respons ASP untuk properti Aliran Output :

adoCmd.Properties("Output Stream") = Response  

Selanjutnya, tentukan parameter adExecuteStream dari Execute. Contoh ini membungkus aliran dalam tag XML untuk membuat pulau data XML:

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

Keterangan

Pada titik ini, XML telah dialirkan ke browser klien dan siap untuk ditampilkan. Ini dilakukan dengan menggunakan VBScript sisi klien untuk mengikat dokumen XML ke instans DOM dan mengulangi setiap simpul anak untuk membangun daftar Produk dalam HTML.