Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Использование XML совместно с SQL.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

Выполнение запроса xPath

С помощью ADO также можно выполнять запросы XPath, правда, пока только на аннотированных XDR-схемах. Вот скрипт на vbs, выполняющий такой запрос:

' Определяем константы ADO.

Const adCmdText = 1

Const adExecuteStream = &H400

' Создание объектов

Dim cmd,conn,cmdStream

Dim ie

Set ie = CreateObject("InternetExplorer.Application")

ie.Navigate "about:blank"

Set cmd = CreateObject("ADODB.Command")

Set conn = CreateObject("ADODB.Connection")

Set cmdStream = CreateObject("ADODB.Stream")

conn.Provider = "sqloledb"

conn.Open "Data Source=server;Initial catalog=pubs;", "user", "password"

cmdStream.Open

Set cmd.ActiveConnection = conn

cmd.CommandType = adCmdText

' XPath-запрос

cmd.CommandText = "Авторы"

' Диалект XPath

cmd.Dialect = "{EC2A4293-E898-11D2-B1B7-00C04F680C56}"

cmd.Properties("Base Path") = "C:\Inetpub\wwwroot\server_pubs"

cmd.Properties("Output Stream") = cmdStream

' Аннотированная схема

cmd.Properties("Mapping Schema") = "schema\myschema.xml"

' Шаблон трансформации

cmd.Properties("XSL") = "\template\first_select.xsl"

cmd.Properties("xml root") = "my_root"

cmd.Execute , , adExecuteStream

Dim str

str = cmdStream.ReadText

do

loop while ie.Busy

ie.Document.writeln CStr(str)

ie.Document.close

ie.visible = 1

Здесь я использовал новую аннотированную схему и шаблон трансформации.

Аннотированная схема:

<?xml version="1.0" encoding="windows-1251" ?>

<Schema xmlns="urn:schemas-microsoft-com:xml-data"

xmlns:sql="urn:schemas-microsoft-com:xml-sql"

xmlns:dt="urn:schemas-microsoft-com:datatypes">

<ElementType name="Авторы" sql:relation="authors">

<AttributeType name="Имя" dt:type="string" />

<AttributeType name="Фамилия" dt:type="string" />

<AttributeType name="Адрес" dt:type="string" />

<attribute type="Имя" sql:field="au_fname" />

<attribute type="Фамилия" sql:field="au_lname" />

<attribute type="Адрес" sql:field="address" />

</ElementType>

</Schema>

Шаблон трансформации:

<?xml version="1.0" encoding="windows-1251" ?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match = "*">

<xsl:apply-templates />

</xsl:template>

<xsl:template match = "/">

<html>

<body>

<table border="1" style="table-layout:fixed" width="600">

<tr bgcolor="teal">

<th><font color="white">Имя</font></th>

<th><font color="white">Фамилия</font></th>

<th><font color="white">Адрес</font></th>

</tr>

<xsl:for-each select="my_root/Авторы">

<tr>

<td><font color="teal"><xsl:value-of select="@Имя"/></font></td>

<td><font color="teal"><xsl:value-of select="@Фамилия"/></font></td>

<td><font color="teal"><xsl:value-of select="@Адрес"/></font></td>

</tr>

</xsl:for-each>

</table>

</body>

</html>

</xsl:template>

</xsl:stylesheet>

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

Предположим, ваш SQL Server работает в очень напряженном режиме, и вы не хотите нагружать его еще больше, заставляя формировать XML-документы. Можно сделать так: создать обычный рекордсет и загрузить его в формате XML в объект DOMDocument или какой-либо другой. Решение на первый взгляд здравое, однако, поработав немного с таким документом, вы поймете, что это не то. Во-первых, структура такого XML-документа задается жестко без возможности изменения. Во-вторых, схема сохраняется в формате XDR, а он уже стар и может не удовлетворять вашим потребностям. К тому же возникают проблемы с выполнением шаблонов и XPath-запросами. Для решения этих (и многих других) проблем был создан новый сервисный провайдер – SQLXMLOLEDB. Как и другие сервисные провайдеры (например, MSDataShape) он предназначен только для преобразования результирующего набора строк в нужный формат. Так как SQLXMLOLEDB ничего не знает о форматах протоколов обмена данными с SQL-серверами, он использует для этого соответствующий провайдер. К сожалению, провайдер SQLXMLOLEDB пока умеет работать совместно только с SQLOLEDB-провайдером для SQL Server, однако в будущем (по крайней мере, я очень надеюсь) он сможет работать с другими провайдерами, например, MSDAORA (провайдер для Oracle). Если такая поддержка будет встроена, у нас будет возможность получать XML-документы от источников, которые не поддерживают XML напрямую.

В режиме форматирования XML-документа на клиенте можно использовать в запросе предикат GROUP BY и агрегатные функции, недоступные в режиме формирования XML-документа на сервере (в режиме FOR XML AUTO). Как и любой другой сервисный провайдер, SQLXMLOLEDB предоставляет свой синтаксис запросов. К счастью, он не так сложен, как, например, синтаксис провайдера MSDataShape и ограничивается, по существу, следующим:

Оператор

Назначение

FOR XML RAW

Аналогичен серверному FOR XML RAW

FOR XML NESTED

Аналогичен серверному FOR XML AUTO

FOR XML EXPLICIT

Аналогичен серверному FOR XML EXPLICIT

Архитектура формирования документов на клиентской стороне изображена на рисунке 1.

Рисунок 1.

Возможность

Формирование на клиенте

Формирование на сервере

Использование предиката GROUP BY и агрегатных функций совместно с FOR XML AUTO (NESTED)

Да

Нет

Возможность получения одновременно нескольких рекордсетов

Нет

Да

Задание имен элементов результирующего документа с помощью псевдонимов таблиц

Нет

Да

Другие отличия вы можете найти в MSDN. Давайте перейдем к примерам.