Поделиться через


Использование результатов FOR XML в коде приложения

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

При помощи предложения FOR XML в SQL-запросах можно получать и даже преобразовывать результаты запросов в формат XML. Эта функция позволяет выполнять следующие задачи, когда результаты запроса FOR XML могут использоваться в коде XML приложения:

В этой статье приведены примеры, демонстрирующие эти подходы.

Получение данных FOR XML с помощью островов данных ADO и XML

Объект ADO Stream или другие объекты, поддерживающие интерфейс COM IStream, например объекты запросов и ответов Active Server Pages (ASP), можно использовать для содержания результатов при работе с запросами FOR XML.

Например, в следующем коде ASP показаны результаты запроса столбца типа данных XML , демографических данных в Sales.Store таблице примера базы данных AdventureWorks. В частности, запрос производит поиск значения столбца для строки, в которой значение CustomerID равно 3.

<!-- BeginRecordAndStreamVBS -->
<%@ LANGUAGE = VBScript %>
<!-- %  Option Explicit  % -->
<!-- 'Request.ServerVariables("SERVER_NAME") & ";" & _ -->
<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=(local);" & _
            "Initial Catalog=AdventureWorks;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 Demographics from Sales.Store WHERE CustomerID = 3 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
   Dim root
   Set root = xmlDoc.documentElement.childNodes.Item(0).childNodes.Item(0).childNodes.Item(0)
   For each child in root.childNodes
      dim OutputXML
      OutputXML = document.all("log").innerHTML
      document.all("log").innerHTML = OutputXML & "<LI><B>" & child.nodeName &  ":</B>  " & child.Text  & "</LI>"
   Next
   MsgBox xmlDoc.xml
</SCRIPT>
</HEAD>
<BODY>
   <H3>Client-side processing of XML Document MyDataIsle</H3>
   <UL id=log>
   </UL>
</BODY>
</HTML>
<!-- EndRecordAndStreamVBS -->

Этот пример ASP-страницы содержит работающий на стороне сервера скрипт VBScript, выполняющий запрос FOR XML через ADO и возвращающий результат в виде острова XML-данных с именем MyDataIsle. Затем этот остров XML-данных возвращается браузеру и подвергается дополнительной обработке на стороне клиента После этого на стороне клиента дополнительный код скрипта VBScript используется для обработки содержимого острова XML-данных. После этого этапа обработки содержимое отображается в виде результирующего DHTML и открывается окно сообщения, где отображается обработанное содержимое острова XML-данных.

Тестирование этого примера

  1. Убедитесь, что IIS установлен, а также что установлена примерная база данных AdventureWorks для SQL Server.

    Данному примеру требуются службы IIS версии 5.0 или более поздней, с включенной поддержкой ASP. Кроме того, необходимо установить образец базы данных AdventureWorks.

  2. Скопируйте код приведенного выше примера и вставьте его в редактор текста или XML. Сохраните файл под именем RetrieveResults.asp в корневой каталог, используемый IIS. Обычно это каталог «C:\Inetpub\wwwroot».

  3. Откройте страницу ASP в окне браузера, указав следующий URL-адрес. Сначала замените MyServer на localhost или фактическое имя сервера, на котором установлены SQL Server и IIS.

    https://MyServer/RetrieveResults.asp
    

Результаты, сформированные в виде страниц HTML, будут выглядеть следующим образом:

Обработка на стороне сервера

Page Generated @ 3/11/2006 3:36:02 PM

Connect String = Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=AdventureWorks;Integrated Security=SSPI;

ADO Version = 2.8

adoConn.State = 1

Query String = SELECT Demographics from Sales.Store WHERE CustomerID = 3 FOR XML AUTO

Pushing XML to client for processing

Обработка XML-документа MyDataIsle на стороне клиента

  • AnnualSales: 1500000

  • AnnualRevenue: 150000

  • BankName: Primary International

  • Тип бизнеса: ОС

  • YearOpened: 1974

  • Специальность: Дорога

  • SquareFeet: 38000

  • Brands: 3

  • Internet: DSL

  • NumberEmployees: 40

Затем окно сообщения VBScript отобразит следующее содержимое исходного, нефильтрованного массива XML-данных, который был возвращен по запросу FOR XML.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Sales.Store>
    <Demographics>
      <StoreSurvey xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey">
        <AnnualSales>1500000</AnnualSales>
        <AnnualRevenue>150000</AnnualRevenue>
        <BankName>Primary International</BankName>
        <BusinessType>OS</BusinessType>
        <YearOpened>1974</YearOpened>
        <Specialty>Road</Specialty>
        <SquareFeet>38000</SquareFeet>
        <Brands>3</Brands>
        <Internet>DSL</Internet>
        <NumberEmployees>40</NumberEmployees>
      </StoreSurvey>
    </Demographics>
  </Sales.Store>
</ROOT>

Получение данных FOR XML с помощью ASP.NET и платформы .NET Framework

Как и в предыдущем примере, код ASP.NET отображает результаты запроса столбца Demographics типа xml из таблицы Sales.Store в образце базы данных AdventureWorks. Как и в предыдущем случае, запрос ищет значение этого столбца, соответствующее строке, в которой CustomerID равен значению 3.

В этом примере используются следующие управляемые API Microsoft .NET Framework для возвращения и отображения результатов запроса FOR XML.

  1. Соединение с SQL Server производится черезSqlConnection по строке соединения, содержащейся в символьной переменной, strConn.

  2. После этогоSqlDataAdapter , используя соединение SQL и указанную строку SQL-запроса, выполняет запрос FOR XML.

  3. После выполнения запроса вызывается метод SqlDataAdapter.Fill , который передает экземпляр DataSet, MyDataSet, чтобы заполнить набор данных результатами выполнения запроса FOR XML.

  4. Затем вызывается метод DataSet.GetXml , который возвращает результаты запроса в виде строки, отображаемой на странице HTML, формируемой на сервере.

    <%@ Page Language="VB" %>
    <HTML>
    <HEAD>
    <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>
    </HEAD>
    <BODY>
    <%
    Dim s as String
    s = "<H3>Server-side processing</H3>" & _
        "Page Generated @ " & Now() & "<BR/>"
    
    Dim SQL As String
    SQL = "SELECT Demographics from Sales.Store WHERE CustomerID = 3 FOR XML AUTO"
    
    Dim strConn As String
    strConn = "Server=(local);Database=AdventureWorks;Integrated Security=SSPI;"
    
    Dim MySqlConn As New System.Data.SqlClient.SqlConnection(strConn)
    Dim MySqlAdapter As New System.Data.SqlClient.SqlDataAdapter(SQL,MySqlConn)
    Dim MyDataSet As New System.Data.DataSet
    
    MySqlConn.Open()
    s = s & "<P>SqlConnection opened.</P>"
    
    MySqlAdapter.Fill(MyDataSet)
    s = s & "<P>" & MyDataSet.GetXml  & "</P>"
    
    MySqlConn.Close()
    s = s & "<P>SqlConnection closed.</P>"
    
    Message.InnerHtml=s
    %>
    <SPAN id="Message" runat=server />
    </BODY>
    </HTML>
    

Тестирование этого примера

  1. Убедитесь, что службы IIS установлены, а также установлена пример базы данных AdventureWorks для SQL Server.

    Данному примеру требуются службы IIS версии 5.0 или более поздней, с включенной поддержкой ASP.NET. Кроме того, необходимо установить образец базы данных AdventureWorks.

  2. Скопируйте код приведенного выше примера и вставьте его в редактор текста или XML. Сохраните файл под именем RetrieveResults.aspx в корневой каталог, используемый для IIS. Обычно это каталог «C:\Inetpub\wwwroot».

  3. Откройте страницу ASP.NET в окне браузера, указав следующий URL-адрес. Сначала замените MyServer на localhost или фактическое имя сервера, на котором установлены SQL Server и IIS.

    https://MyServer/RetrieveResults.aspx
    

Результаты, сформированные в виде страниц HTML, будут выглядеть следующим образом:

Обработка на стороне сервера

Page Generated @ 3/11/2006 3:36:02 PM

SqlConnection opened.

<Sales.Store><Demographics><StoreSurvey xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey"><AnnualSales>1500000</AnnualSales><AnnualRevenue>150000</AnnualRevenue><BankName>Primary International</BankName><BusinessType>OS</BusinessType><YearOpened>1974</YearOpened><Specialty>Road</Specialty><SquareFeet>38000</SquareFeet><Brands>3</Brands><Internet>DSL</Internet><NumberEmployees>40</NumberEmployees></StoreSurvey></Demographics></Sales.Store>

SqlConnection closed.

Примечание.

Поддержка типа данных xml в SQL Server позволяет запросить, чтобы результат запроса FOR XML возвращался как тип данных xml, а не как строковые или image-данные, с использованием директивы TYPE. Если в запросе FOR XML указана директива TYPE, она предоставляет программный доступ к результатам FOR XML, как описано в разделе Использование XML-данных в приложениях.

См. также