- •Iis и xml функции sql Server
- •Поддержка xml в Microsoft sql Server 2000
- •Примеры
- •Iis и xml функции sql Server
- •Шаблоны
- •Запросы xPath
- •Замечания по разделу
- •Возможности ado 2.5 Сохранение и загрузка из файла в формате xml
- •Выдача Recordset’а в формате xml непосредственно в поток Response
- •Трансформация с помощью domDocument
- •Возможности ado 2.6
- •Использование Command для формирования xml-документа на сервере
- •Выполнение шаблона
- •Выполнение запроса xPath
- •Шаблон с агрегатными функциями
- •Формирование xml-документа на клиенте с помощью ado
- •Апдейтаграммы и xml Bulk Load
- •Апдейтаграммы
- •Добавление данных
- •Обновление данных
- •Удаление
- •Создание новой таблицы и загрузка данных
- •Загрузка иерархических документов
- •Заключение
- •Литература
- •Предисловие
- •Настройка iis
- •Содержание wsdl-файла
- •Секция types
- •Секция message
- •Секция portType
- •Формы сообщений
- •Секция binding
- •Секция service
- •Создание Web-методов
- •Тестируем Web-сервис
- •Поддержка sqlxml в .Net Framework
- •Тестовый проект
- •Цели и ограничения
- •Реализация
- •Заключение
- •Литература
- •Тип данных xml Основы
- •Метод query
- •Метод value
- •Метод exist
- •Метод modify
- •Использование xml-типа
- •Хранение xml-типа
- •Поддержка xml Schema
- •Создание схемы
- •Удаление схемы
- •Ограничения текущей реализации
- •Безопасность
- •Вложенные запросы for xml
- •Генерация xsd на лету
- •Поддержка xQuery
- •Тело запроса
- •Конструкторы узлов
- •Операторы сравнения
- •Операторы сравнения атомарных значений
- •Общие операторы сравнения
- •Операторы сравнения узлов
- •Логические операторы
- •Условные выражения
- •Flwor-выражения
- •Кванторные выражения
- •Сортировка
- •Заключение
- •Литература
Выполнение запроса 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. Давайте перейдем к примерам.
