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.