Учебная работа. Реферат: Использование XML совместно с SQL

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Контрольные рефераты

Учебная работа. Реферат: Использование XML совместно с SQL

Внедрение XML вместе с SQL

XML и современные базы данных

Алексей Ширшов

Введение

Этот материал посвящен тем нововведениям, которые возникли в SQL и разработках доступа к базам данных благодаря XML. Статья обрисовывает базисные механизмы и способности использования XML в MS SQL Server и ADO. Статья не претендует на фундаментальные исследования в данной для нас области, потому что XML и SQL Server вещи по природе собственной обширные. Не считая того, уровень поддержки XML в SQL Server повсевременно возрастает, и за всеми переменами очень тяжело уследить. к примеру, опосля выхода SQLXML 3.0, сделалось вероятным употреблять SQL Server в качестве сервера Web-служб. К огорчению, данная тема в статье не освещается, но в дальнейшем, может быть, найдется время и для нее.

Своим возникновением статья должна тому кавардаку, который был в голове у создателя по данному вопросцу.

Поддержка
XML
в
Microsoft SQL Server 2000

Microsoft SQL Server 2000 содержит интегрированные средства для работы с XML. Результирующую подборку можно представлять в формате XML при помощи главных слов for xml оператора select, также создать запрос из документа XML при помощи оператора OPENXML.

FOR XML

Этот оператор предназначен для представления результирующего набора строк в виде XML-документа. Разглядим его синтаксис:

[ FOR XML EXPLICIT

[ , XMLDATA ]

[ , ELEMENTS ]

[ , BINARY BASE64 ]

]

Предназначение главного слова BROWSE не относится к теме нашей статьи.

FOR XML RAW – Любая строчка представляется в виде элемента <row/>. Заглавие поля сформировывает заглавие атрибута, а

FOR XML AUTO – документ XML форматируется буквально так же, как и при XML RAW, лишь заглавие элемента, представляющего строчку, заменяется на заглавие таблицы.

FOR XML EXPLICIT – Самый непростой и гибкий вариант для сотворения XML-документов. В этом режиме можно сформировывать документы фактически хоть какой формы, но для этого сам запрос должен быть написан по определенным правилам. Наиболее тщательно они рассматриваются ниже.

XMLDATA – время от времени бывает полезно получить не только лишь сами данные, да и их схему. Схема данных также записывается в формате XML. Она описывает типы частей и атрибутов, накладывает ограничения на их значения, и совершенно представляет метаинформацию, позволяющую проверить документ на реальность (validity). Существует несколько разновидностей (форматов) схем данных. SQL Server употребляет XDR-схемы (XML Data Reduced). Подробную документацию по XDR можно отыскать в [1]. Ключевое слово XMLDATA быть может применено для всех 3-х режимов формирования XML-документа (raw, auto и explicit).

ELEMENTS – Ключевое слово, использующееся лишь вместе с FOR XML AUTO. При его указании поля формируются как элементы: заглавие поля соответствует наименованию элемента, а

BINARY BASE64 – Описывает, как будут выведены двоичные данные (binary data).

ПРЕДУПРЕЖДЕНИЕ

SQL Server не дозволяет употреблять предикат GROUP BY вместе с FOR XML AUTO.

Примеры

Для простоты и удобства будем употреблять обычную базу данных PUBS из поставки SQL Server 2000. нужно сказать, что Query Analyzer – не наилучшее средство для просмотра XML-документов, т.к. итог он помещает в одну ячейку, как текстовое поле (либо в одну строчку, обрезая текст, при выводе результата в виде текста). Потому, если вы желаете испробовать все примеры сами, обратитесь к разделу IIS и XML-функции SQL Server.

Начнем с рассмотрения FOR XML RAW:

select au_fname, au_lname, address

from authors

where au_fname like ‘M%’

for xml raw

Этот запрос возвращает имена всех создателей, начинающиеся с буковкы M. Вот результаты в формате XML:

<row au_fname=»Marjorie» au_lname=»Green» address=»309 63rd St. #411″ />

<row au_fname=»Michael» au_lname=»O’Leary» address=»22 Cleveland Av. #14″ />

<row au_fname=»Meander» au_lname=»Smith» address=»10 Mississippi Dr.» />

<row au_fname=»Morningstar» au_lname=»Greene» address=»22 Graybar House Rd.» />

<row au_fname=»Michel» au_lname=»DeFrance» address=»3 Balding Pl.» />

сейчас заменим xml raw на xml auto:

<authors au_fname=»Marjorie» au_lname=»Green» address=»309 63rd St. #411″ />

<authors au_fname=»Michael» au_lname=»O’Leary» address=»22 Cleveland Av. #14″ />

<authors au_fname=»Meander» au_lname=»Smith» address=»10 Mississippi Dr.» />

<authors au_fname=»Morningstar» au_lname=»Greene» address=»22 Graybar House Rd.» />

<authors au_fname=»Michel» au_lname=»DeFrance» address=»3 Balding Pl.» />

Видите ли, конфигурации невелики. Заместо наименования элемента «row» подставляется имя таблицы. Сейчас добавим к этому запросу ключевое слово ELEMENTS.

select au_fname, au_lname, address

from authors

where au_fname like ‘M%’

for xml auto, elements

Вот результаты:

<authors>

<au_fname>Marjorie</au_fname>

<au_lname>Green</au_lname>

<address>309 63rd St. #411</address>

</authors>

<authors>

<au_fname>Michael</au_fname>

<au_lname>O’Leary</au_lname>

<address>22 Cleveland Av. #14</address>

</authors>

<authors>

<au_fname>Meander</au_fname>

<au_lname>Smith</au_lname>

<address>10 Mississippi Dr.</address>

</authors>

<authors>

<au_fname>Morningstar</au_fname>

<au_lname>Greene</au_lname>

<address>22 Graybar House Rd.</address>

</authors>

<authors>

<au_fname>Michel</au_fname>

<au_lname>DeFrance</au_lname>

<address>3 Balding Pl.</address>

</authors>

документ вышел наиболее массивным: все поля представлены элементами.

При помощи главного слова XMLDATA можно получить документ со схемой данных.

select au_fname, au_lname, address

from authors

where au_fname like ‘M%’

for xml auto, xmldata

Этот запрос возвратит таковой документ:

<Schema name=»Schema1″ xmlns=»urn:schemas-microsoft-com:xml-data»

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

<ElementType name=»authors» content=»empty» model=»closed»>

<AttributeType name=»au_fname» dt:type=»string» />

<AttributeType name=»au_lname» dt:type=»string» />

<AttributeType name=»address» dt:type=»string» />

<attribute type=»au_fname» />

<attribute type=»au_lname» />

<attribute type=»address» />

</ElementType>

</Schema>

<authors xmlns=»x-schema:#Schema1″

au_fname=»Marjorie» au_lname=»Green» address=»309 63rd St. #411″ />

<authors xmlns=»x-schema:#Schema1″

au_fname=»Michael» au_lname=»O’Leary» address=»22 Cleveland Av. #14″ />

<authors xmlns=»x-schema:#Schema1″

au_fname=»Meander» au_lname=»Smith» address=»10 Mississippi Dr.» />

<authors xmlns=»x-schema:#Schema1″

au_fname=»Morningstar» au_lname=»Greene» address=»22 Graybar House Rd.» />

<authors xmlns=»x-schema:#Schema1″

au_fname=»Michel» au_lname=»DeFrance» address=»3 Balding Pl.» />

Видите ли, сейчас документу предшествует ХDR-схема, позволяющая проверить корректность его содержимого.

FOR XML EXPLICIT

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

1-ое поле постоянно именуется tag и представляет собой числовой идентификатор таблицы. Вы сможете указывать для него любые числовые значения. В результирующем документе он не возникает, и нужен лишь, чтоб найти связи меж таблицами для формирования иерархического документа. 2-ое поле именуется parent и тоже может представлять хоть какой числовой идентификатор. Он описывает родительскую таблицу для данной таблицы и в результирующем документе также не находится. Если родитель отсутствует, указывается 0 либо NULL. Для иерархических выборок необходимо употреблять несколько запросов, объединенных при помощи оператора UNION ALL.

Опосля 2-ух неотклонимых полей tag и parent следуют поля, которые требуется избрать из таблицы. Для их должен быть задан псевдоним, определяющий тип XML-узла, его заглавие и другую информацию. Вот синтаксис этого псевдонима:

ElementName!TagNumber!AttributeName!Directive

Разглядим предназначение каждой из частей этого псевдонима:

ElementName – имя элемента, в каком будет находится элемент данного поля. Обычно тут указывается имя таблицы.

TagNumber – идентификатор таблицы, в какой находится данное поле. Одному и тому же ElementName постоянно должен соответствовать один TagNumber. Он также не отображается ни в котором виде в результирующем документе, но нужен для определения иерархических связей меж таблицами.

AttributeName – имя атрибута (либо элемента), представляющего данное поле.

Directive – по существу, представляет собой тип узла. Может принимать последующие значения:

element
поле представляется в виде элемента

xml
То же самое, что element, но не делает трансформации текста. К примеру, знак меньше (<) не преобразуется в ссылку &lt;

cdata
недозволено.

hide
дозволяет скрыть поле

id,idref,idrefs
разрешают созодать ссылки на остальные элементы. Эти атрибуты имеют Разглядим маленькой пример. В самом начале мы разглядывали запрос с внедрением FOR XML RAW:

select au_fname,au_lname,address from authors where au_fname like ‘M%’ for xml raw

Перепишем его с внедрением FOR XML EXPLICIT:

select 1 as tag,

0 as parent,

au_fname as ‘authors!1!fname’,

au_lname as ‘authors!1!lname’,

address as ‘authors!1!address’

from authors where au_fname like ‘M%’

for xml explicit

Итог будет буквально таковым же. Незначительно исправим запрос для демонстрации способностей директивы FOR XML EXPLICIT.

select 1 as tag,

0 as parent,

au_fname as ‘authors!1!fname’,

au_lname as ‘authors!1!lname!element’,

address as ‘authors!1!!cdata’

from authors where au_fname like ‘M%’

for xml explicit

Вот итог:

<authors lname=»Green»>

<fname>Marjorie</fname>

<![CDATA[ 309 63rd St. #411 ]]>

</authors>

<authors lname=»O’Leary»>

<fname>Michael</fname>

<![CDATA[ 22 Cleveland Av. #14 ]]>

</authors>

<authors lname=»Smith»>

<fname>Meander</fname>

<![CDATA[ 10 Mississippi Dr. ]]>

</authors>

<authors lname=»Greene»>

<fname>Morningstar</fname>

<![CDATA[ 22 Graybar House Rd. ]]>

</authors>

<authors lname=»DeFrance»>

<fname>Michel</fname>

<![CDATA[ 3 Balding Pl. ]]>

</authors>

Хорошо для 1-го запроса! Так как для поля au_lname указан атрибут element, оно представлено в виде элемента. адресок находится в секции CDATA.

сейчас разглядим, как сформировывать иерархические документы. Возьмем таковой запрос:

select pub_name,city,fname,lname

from publishers as p

join employee as e on p.pub_id = e.pub_id

where pub_name like ‘Binnet%’ or pub_name like ‘New Moon%’

order by pub_name,city,fname,lname

Он возвращает имена всех служащих издательств Binnet & Hardley и New Moon Books. Итог запроса (20 записей) я приводить не буду, отмечу лишь, что он содержит огромное количество циклических заглавий издательств, т.к. итог представлен в реляционной форме. Мы же желаем получить последующее:

<pubs PubName=»Binnet & Hardley» City=»Washington»>

<employee First_Name=»Anabela» Last_Name=»Domingues» />

<employee First_Name=»Daniel» Last_Name=»Tonini» />

<employee First_Name=»Elizabeth» Last_Name=»Lincoln» />

<employee First_Name=»Helen» Last_Name=»Bennett» />

<employee First_Name=»Lesley» Last_Name=»Brown» />

<employee First_Name=»Martine» Last_Name=»Rance» />

<employee First_Name=»Paolo» Last_Name=»Accorti» />

<employee First_Name=»Paul» Last_Name=»Henriot» />

<employee First_Name=»Peter» Last_Name=»Franken» />

<employee First_Name=»Victoria» Last_Name=»Ashworth» />

</pubs>

<pubs PubName=»New Moon Books» City=»Boston»>

<employee First_Name=»Gary» First_Name=»Thomas» />

<employee First_Name=»Howard» First_Name=»Snyder» />

<employee First_Name =»Karin» First_Name=»Josephs» />

<employee First_Name =»Laurence» Last_Name=»Lebihan» />

<employee First_Name =»Martin» Last_Name=»Sommer» />

<employee First_Name =»Mary» Last_Name=»Saveley» />

<employee First_Name =»Matti» Last_Name=»Karttunen» />

<employee First_Name =»Palle» Last_Name=»Ibsen» />

<employee First_Name =»Roland» Last_Name=»Mendel» />

<employee First_Name =»Timothy» Last_Name=»O’Rourke» />

</pubs>

И как, спросите вы? Приблизительно так:

select 1 as tag, — первыйподзапрос

0 as parent,

pub_name as ‘pubs!1!PubName’,

city as ‘pubs!1!City’,

NULL as ’employee!2!First_Name’,

NULL as ’employee!2!Last_Name’

from publishers as pubs

where pub_name like ‘Binnet%’ or pub_name like ‘New Moon%’

union all select 2 as tag, — второйподзапрос

1 as parent,

pubs.pub_name,

pubs.city,

fname,

lname

from employee as e, publishers as pubs

where (pub_name like ‘Binnet%’ or pub_name like ‘New Moon%’)

and pubs.pub_id = e.pub_id

order by ‘pubs!1!PubName’, ‘pubs!1!City’,

’employee!2!First_Name’, ’employee!2!Last_Name’

for xml explicit

Давайте разглядим все по порядку. Поначалу производится 1-ый подзапрос. Его итог приведен в таблице 1.

tag
parent
pubs!1!PubName
pubs!1!City
employee!2!First_Name
employee!2!Last_Name

1
0
New Moon Books
Boston
NULL
NULL

1
0
Binnet & Hardley
Washington
NULL
NULL

Таблица 1.

Потом 2-ой (Таблица 2).

tag
parent
pub_name
city
fname
lname

2
1
Binnet & Hardley
Washington
Paolo
Accorti

2
1
Binnet & Hardley
Washington
Victoria
Ashworth

2
1
Binnet & Hardley
Washington
Helen
Bennett

2
1
Binnet & Hardley
Washington
Lesley
Brown






Таблица 2.

Потом происходит сортировка, и на базе полей tag и parent SQL Server сформировывает иерархический XML документ.

ПРИМЕЧАНИЕ

Для отладки схожих запросов лучше не указывать оператор FOR XML EXPLICIT. Тогда данные будут представлены в обыкновенной реляционной форме.

На этом мы, пожалуй, закончим рассмотрение оператора FOR XML EXPLICIT – приведение примеров использования всех атрибутов заняло бы очень много места.

OPENXML

Функция OPENXML является аналогом OPENROWSET, OPENDATASOURCE и OPENQUERY, которые разрешают делать запросы из удаленных источников. Вот ее синтаксис:

OPENXML(idoc int [in],rowpattern nvarchar[in],[flags byte[in]])

[WITH (SchemaDeclaration | TableName)]

Аргументы:

idoc – хендл XML-документа, приобретенный с помощью хранимой процедуры sp_xml_preparedocument;

rowpattern – локализуемая группа XPath либо, проще говоря, XPath-выражение;

flags – набор флагов, указывающих на то, как должны быть сопоставлены данные документа XML и реляционного набора строк;

ShemaDeclaration – определение полей реляционного набора строк в формате:

ColName ColType [ColPattern | MetaProperty]

Где

ColName – имя поля.

ColType – тип поля. Допускаются все типы SQL Server.

ColPattern — локализуемая группа XPath для поля.

MetaProperty – метасвойство. Его мы разглядывать не будем.

XML-документ подготавливается при помощи хранимой процедуры sp_xml_preparedocument. Процедура употребляет анализатор MSXML для проверки документа на корректность и возвращает хендл документа. Опосля окончания работы с OPENXML хендл необходимо закрыть при помощи процедуры sp_xml_removedocument.

ПРИМЕЧАНИЕ

sp_xml_preparedocument подготавливает XML-документ, представляя его в виде объектной модели DOM (Document Object Model). Если вы работаете с большенными документами, это может вызвать некие задачи.

Как видно из синтаксиса, вы сможете не указывать флаги и определения полей для реляционного набора строк. В этом случае SQL Server создаст внутреннее представление XML-документа в так именуемом «edge table»-формате. Он фактически не читаем, но при большенном желании его можно употреблять. Описание этого формата выходит за рамки данной статьи, но в качестве подтверждения того, что с ним можно работать, приведу пример. Пусть у нас имеется таковой XML-документ:

<?xml version=»1.0″ encoding=»windows-1251″ ?>

<rsdn>

<forums date=»09.01.03″>

<forum name=»WinAPI» totalposts=»16688″

description=»Системноепрограммирование»>

<moderators/>

<top-poster>Alex Fedotov</top-poster>

</forum>

<forum name=»COM» totalposts=»10116″

description=»Компонентныетехнологии»>

<moderators/>

<top-poster>Vi2</top-poster>

</forum>

<forum name=»Delphi» totalposts=»5001″

description=»Delphi и Builder»>

<moderators>

<moderator name=»Sinclair»/>

<moderator name=»Hacker_Delphi»/>

</moderators>

<top-poster>Sinclair</top-poster>

</forum>

<forum name=»DB» totalposts=»6606″ description=»Базыданных»>

<moderators>

<moderator name=»_MarlboroMan_»/>

</moderators>

<top-poster>Merle</top-poster>

</forum>

</forums>

</rsdn>

Вот запрос, ворачивающий полное количество сообщений для всякого форума:

exec sp_xml_preparedocument @hdoc out, @_xmlbody

select [text] as totalposts

from openxml(@hdoc,’/rsdn/forums/forum’) as f

join (select [id],localname

from openxml(@hdoc,’/rsdn/forums/forum’)

where localname = ‘totalposts’) as d on d.[id] = f.parentid

exec sp_xml_removedocument @hdoc

Результатом его будет последующая таблица:

totalposts

16688

10116

5001

6606

Не советую употреблять схожий способ в рабочих проектах, и не только лишь поэтому, что он неэффективен (как видно из примера, XML-документ сканируется два раза). Разглядим пример, выдающий этот же самый итог с внедрением XPath.

exec sp_xml_preparedocument @hdoc out, @_xmlbody

select *

from openxml(@hdoc,’/rsdn/forums/forum’)

with(totalposts varchar(100) ‘attribute::totalposts’)

exec sp_xml_removedocument @hdoc

тут, чтоб ограничить реляционный набор строк, я пользовался XPath-выражением.

Выражение attribute::totalposts значит, что для поля totalposts будет употребляться

«attribute::» можно поменять эмблемой @;

«self::node()» можно поменять на точку (.);

«parent::node()» можно поменять на две точки (..).

Остальные сокращения можно отыскать в спецификации XPath.

Давайте разглядим наиболее непростой пример: выберем заглавие форума, модера и дату сотворения статистики для всех форумов, у каких больше 6000 сообщений.

exec sp_xml_preparedocument @hdoc out, @_xmlbody

select

forum as ‘форум‘,

case when moders is null

then ‘нет’

else moders

end as ‘модер‘,

[date] as ‘Датасоздания’

from openxml(@hdoc,’/rsdn/forums/forum[attribute::totalposts > «6000»]’) with

(

moders varchar(50) ‘moderators/moderator/attribute::name’,

forum varchar(50) ‘attribute::name’,

[date] varchar(50) ‘parent::node()/attribute::date’

)

exec sp_xml_removedocument @hdoc

часть запроса, использующую XPath, можно переписать в сокращенной форме :

openxml(@hdoc,’/rsdn/forums/forum[@totalposts > «6000»]’) with

(

moders varchar(50) ‘moderators/moderator/@name’,

forum varchar(50) ‘@name’,

[date] varchar(50) ‘../@date’

)

Всюду дальше я буду воспользоваться сокращенной записью.

Чтоб разобраться с флагами OPENXML, разглядим слегка измененный пример из MSDN:

DECLARE @idoc int

DECLARE @doc varchar(1000)

SET @doc =’

<root>

<Customer cid= «C1″ city=»Issaquah»>

<name>Janine</name>

<Order oid=»O1″ date=»1/20/1996″ amount=»3.5″ />

<Order oid=»O2″ date=»4/30/1997″ amount=»13.4″>

Customer was very satisfied

</Order>

</Customer>

<Customer cid=»C2″ city=»Oelde» >

<name>Ursula</name>

<Order oid=»O4″ date=»1/20/1996″ amount=»10000″>Happy Customer.</Order>

<Order oid=»O3″ date=»7/14/1999″ amount=»100″

note=»Wrap it blue white red»>

Sad Customer.

<Urgency>Important</Urgency>

</Order>

</Customer>

</root>’

— Создание внутреннего представления XML-документа.

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT *

FROM OPENXML (@idoc, ‘/root/Customer’, 2) WITH

(

cid char(5) ‘@cid’,

[name] varchar(20),

oid char(5) ‘Order/@oid’,

amount float ‘Order/@amount’,

comment varchar(100) ‘Order/text()’

)

— Чистка

EXEC sp_xml_removedocument @idoc

Итог будет последующим:

cid
name
oid
amount
comment

C1
Janine
O1
3.5
Customer was very satisfied

C2
Ursula
O4
10000.0
Happy Customer.

Отметим некие индивидуальности:

В качестве режима отображения XML-данных на поля реляционной таблицы использовалось имени колонки, а потом (если атрибут не найден) будет произведен поиск элемента с подходящим именованием (по другому будет возвращен NULL). Благодаря тому, что в качестве флага было обозначено запрос, указывающий, что на эту колонку отображается атрибут cid. Для поля name не потребовалось конкретного указания XPath-выражения. Если б в качестве флага использовалось необходимо бы было ничего указывать, а для name пришлось бы написать шаблон (т.е. просто выражение ‘name’).

Изюминка внедрения XPath-выражений при отображении данных заключается в том, что вероятна подборка данных, расположенных фактически в хоть какой части XML-документа (относительно текущей ветки). Так, можно обратиться к подветкам текущей ветки, родительским веткам, и даже получить данные на базе выполнения некого условия. Если б заместо «comment varchar(100) ‘Order/text()’» было написано «comment varchar(100) ‘Order’», то колонка comment первой строчки содержала бы пустую строчку. Она бралась бы из первого заказа (O1). Но потому что текста в этом элементе нет, функция text() вернет для него false, что приведет к поиску текста в последующем по порядку элементе Order (заказе O2). Таковым образом, в сформированной записи будет находиться информация из первого заказа и комментарий из второго. Прикладного смысла это действие не имеет, но замечательно показывает упругость техники отображения.

На этом мы с вами закончим рассмотрение конструкции OPENXML. Наиболее подробную информацию можно получить в MSDN. Спецификацию XPath можно отыскать в [2].

IIS и XML функции SQL Server

Чтоб делать запросы к SQL Server через HTTP, нужно настроить подходящим образом Интернет. Делается это при помощи мастера «Configure SQL XML Support in IIS». Я не буду обрисовывать на сто процентов его работу, по мере необходимости сможете обратиться к [3]. Не считая этого, настроить виртуальный каталог можно программно при помощи объекта VDirMgr. Он находится в файле sqlvdr3.dll. Для использования класса из VB необходимо добавить ссылку на библиотеку типов Microsoft SQL Virtual Directory Control 1.0 Type Library.

Мастер «Configure SQL XML Support in IIS» делает виртуальный каталог, для обработки запросов к которому назначается особое isapi-расширение: sqlisapi.dll. Эта библиотека, используя провайдер SQL OLEDB, связывается с SQL Server для отправки запросов и получения результатов. Результирующие подборки, выставленные уже в формате XML, передаются назад вызывающей стороне по HTTP. При помощи мастера вы сможете указать:

Учетную запись SQL Server либо Windows, под которой будут производиться все запросы;

комп, на котором размещен SQL Server и базу данных;

Подкаталоги данного виртуального каталога для хранения разных типов файлов (шаблонов, схем). Подкаталоги могут быть 3-х предопределенных типов: schema, template и dbobject. В подкаталоге schema хранятся XDR либо XSD схемы данных, которые можно конкретно исполнять в URL-запросе. В подкаталоге с типом template хранятся шаблоны, выполнение которых разрешено через URL-запросы. dbobject – псевдокаталог, его мы разглядывать не будем.

ПРИМЕЧАНИЕ

В SQLXML 3.0 возник еще один тип подкаталогов – soap. Его рассмотрение также выходит за рамки данной статьи.

Раздельно остановимся на настройках каталога. Вы сможете:

Дозволить либо запретить указывать SQL-инструкции конкретно в URL. Отмечу, что в качестве инструкций можно употреблять не только лишь запросы, да и любые остальные операторы. Советую устанавливать эту опцию лишь для отладки, а в обычном режиме работы выключать.

Дозволить либо запретить выполнение запросов, хранящихся в особых шаблонах. Подробнее о шаблонах будет сказано дальше.

Дозволить либо запретить внедрение запросов XPath;

Дозволить либо запретить употреблять способ POST.

URL-запросы

Разглядим синтаксис URL-запроса к SQL Server:

HTTP://iisserver/vroot?sql=sqlinstruction[&param=value[&param=value]…n]

тут:

iisserver – имя интернет-сервера;

vroot – имя виртуального каталога;

sqlinstruction – неважно какая SQL-инструкция;

param – имя параметра. Это не параметр SQL-инструкции либо хранимой процедуры, это параметр шаблона либо один из последующих предопределенных характеристик: contenttype, outputencoding, root и xsl;

value –

Итак, представим, вы сконфигурировали виртуальный каталог для использования базы данных PUBS и окрестили его server_pubs. Положим, ваш комп именуется server. Попробуем написать 1-ый URL-запрос:

http://server/server_pubs/?sql=select au_fname, au_lname, address from authors where au_fname like ‘M%’ for xml raw

Но не все так просто. Ответ будет таковым:

XML document must have a top level element.

1-ый блин, как постоянно, комом! Дело в том, что XML-документ, создаваемый SQL Server’ом, не имеет головного корневого элемента, без которого документ не может считаться верно оформленным. Для указания корневого элемента необходимо добавить параметр root.

HTTP://server/server_pubs/?sql=select au_fname,au_lname,address from authors where au_fname like ‘M%’ for xml raw&root=my_root

В ответ будет выдано:

Incorrect syntax near ‘M’.

Что ж, бывалые юзеры, наверняка, сходу бы приметили символ процента в запросе. Он является зарезервированным эмблемой в имени URL, его код равен 25. Беря во внимание это, перепишем запрос так:

http://server/server_pubs/?sql=select au_fname,au_lname,address from authors where au_fname like ‘M%25’ for xml raw&root=my_root

Ура! Вышло. Итог будет приблизительно таковым же, как в самом первом примере данной для нас статьи.

На вариант, если для вас необходимо получить результаты в виде обыденного html, можно сделать шаблон преобразования на языке XSL и указать еще один параметр в URL – xsl. В качестве значения параметра необходимо указать путь относительно избранной вами виртуальной директории.

Составим шаблон трансформации:

<?xml version=»1.0″ ?>

<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 = «row»>

<li>

<table><tr>

<td><xsl:value-of select = «attribute::au_fname» /></td>

<td><xsl:value-of select = «attribute::au_lname» />.</td>

<td>Address: <xsl:value-of select = «attribute::address» /></td>

</tr></table>

</li>

</xsl:template>

<xsl:template match = «/»>

<html>

<body>

<ul>

<xsl:apply-templates select = «my_root» />

</ul>

</body>

</html>

</xsl:template>

</xsl:stylesheet>

Наиболее подробную информацию о XSL можно отыскать в [4].

В ответ на последующий URL-запрос вы получите перевоплощенный XML-документ.

http://server/server_pubs/?sql=select au_fname,au_lname,address from authors where au_fname like ‘M%25’ for xml raw&root = my_root&xsl = xsl_for_query.xsl

По сути работа с URL-запросами увлекательна лишь 1-ые несколько минут. Вправду, весьма неловко возиться со строчкой адреса и нескончаемыми знаками процента в ней, к тому же URL-запросы не весьма неплохи в смысле сохранности. Кандидатурой им являются шаблоны.

Шаблоны

Шаблоны в контексте данной для нас статьи являются обыкновенными XML-документами, составленными по определенным правилам. Главным их содержанием является SQL-запрос либо вызов хранимой процедуры. Шаблоны также употребляются для запросов XPath, но их я коснусь чуток позднее. характеристики шаблона задаются в URL-строке. Если они там не указаны, берутся значения по дефлоту из соответственных тегов <param>.

Шаблоны хранятся на сервере, потому в смысле сохранности их внедрение намного лучше, чем URL-запросов. Чтоб ISAPI-расширение, которое их обрабатывает, сообразило, что вы вызываете шаблон, его необходимо поместить в собственный виртуальный каталог. Обычно он именуется template. Настроить его можно в упоминавшемся ранее мастере «Configure SQL XML Support in IIS» на закладке Virtual Names.

структура шаблона смотрится так:

<?xml version=»1.0″ ?>

<your_root xmlns:sql=»urn:schemas-microsoft-com:xml-sql»

sql:xsl=»xsl file name»>

<xql:header>

<xql:param name=»your_param_name»> param_value </sql:param>

<xql:param name=»your_param_name»> param_value </sql:param>…n

</xql:header>

<sql:query>

хоть какое SQL-выражение

</sql:query>

</your_root>

Для форматирования результатов выполнения шаблона быть может применена XSL-трансформация. Для этого нужно задать атрибут xsl,

Ах так будет смотреться шаблон, основанный на значительно уже поднадоевшем для вас запросе.

<?xml version=»1.0″ ?>

<my_root xmlns:sql=»urn:schemas-microsoft-com:xml-sql»

sql:xsl=»xsl_for_query.xsl»>

<sql:query>

select au_fname,au_lname,address

from authors where au_fname like ‘M%’ for xml raw

</sql:query>

</my_root>

В нем употребляется та же схема преобразования, что и в прошлом примере. Сейчас попытайтесь его вызвать (представим, вы его сохранили под именованием first_template.xml):

HTTP://server/server_pubs/template/first_template.xml

Итог выходит достаточно странноватым: IE представляет html-документ (получаемый при трансформации) в формате XML. Делает он это на полностью легитимных основаниях, и чтоб итог выдавался все-же в формате html, необходимо очевидно указать тип выходного потока. Это просто создать при помощи параметра contenttype.

HTTP://server/server_pubs/template/first_template.xml?contenttype=text/html

Плюсы шаблонов явны:

Потому что шаблон находится на сервере, вы на сто процентов контролируете его содержимое;

Шаблоны намного проще в использовании;

Тело шаблона и применяемая схема преобразования укрыты от юзера;

Шаблоны можно динамически изменять либо создавать, что присваивает веб-серверу доп упругость;

При помощи шаблонов можно делать запросы XPath, но о этом уже в последующем разделе.

В шаблонах можно употреблять последующие атрибуты (рассмотрены более применяемые):

client-side-xml – Булева переменная, принимающая запрос, передает рекордсет клиенту, и уже там делается формирование документа. Наиболее тщательно клиентские курсоры будут рассмотрены в разделе ADO и XML.

ПРИМЕЧАНИЕ

В данном случае клиентом является комп, откуда поступает запрос к SQL Server-y, другими словами машинка, где размещен SQLXMLOLEDB-провайдер. В случае использования ADO – это машинка клиента. В случае использования шаблонов – сервер IIS.

nullvalue – дозволяет задавать строчку, которая в URL-запросе и запросе XPath будет означать NULL.

is-xml – атрибут параметра, принимающий к примеру, &lt; не заменяется. Если задано текст.

Предназначение остальных атрибутов можно отыскать в MSDN.

Запросы XPath

XPath не рассчитан на работу с реляционными данными. Чтоб употреблять XPath-запросы для подборки реляционных данных, нужно сделать схему данных XDR либо XSD. XDR была разработана несколько годов назад при активном участии Microsoft, т.к. в то время необходимость в схемах данных была, а, по существу, самих схем не было. С возникновением XSD популярность и актуальность внедрения XDR начали падать.

ПРИМЕЧАНИЕ

Спецификацию XSD можно отыскать в [5].

Схема данных делает две принципиальные функции: задает структуру грядущего XML-документа и описывает, какие поля и таблицы должны употребляться при выполнении запроса XPath. Такие схемы именуются аннотированными схемами запросов, а атрибуты, связывающие объекты базы данных с XML-узлами – аннотациями. До выхода в свет SQLXML 2.0 можно было употреблять лишь аннотированные схемы на базе SDR [6]. Но на данный момент лучше употреблять аннотированные схемы на базе спецификации XSD [7]. Некую информацию по преобразованию схем из XDR в наиболее новейший формат XSD можно отыскать в [8].

Вот синтаксис шаблонов с внедрением запросов XPath:

<your_root xmlns:sql=»urn:schemas-microsoft-com:xml-sql»>

<sql:header>

<xql:param name=»your_param_name»> param_value </sql:param>

<xql:param name=»your_param_name»> param_value </sql:param>…n

</sql:header>

<sql:xpath-query mapping-schema=»your_schema.xml»>

XPath query

</sql:xpath-query>

</your_root>

В этом примере аннотированная схема обязана находится в файле your_schema.xml. Как видно из синтаксиса, может быть создание параметризированных запросов XPath. Параметр в запросе обозначается исходным эмблемой $.

Разглядим пример аннотированной схемы XDR, который будет употребляться для запросов XPath. В результирующем документе будут находиться имена, фамилии и адреса всех создателей:

<?xml version=»1.0″ ?>

<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=»address» />

<ElementType name=»Authors» sql:relation=»Authors»>

<AttributeType name=»au_fname» dt:type=»string» />

<AttributeType name=»au_lname» dt:type=»string» />

<attribute type=»au_fname»/>

<attribute type=»au_lname» />

<element type=»address» sql:field=»address»/>

</ElementType>

</Schema>

тут употребляется инструкция relation для того, чтоб указать, с какой таблицей будет связан элемент Authors. Дочерние элементы наследуют связь с таблицей, обозначенной для родительского ElementType. Связывание полей таблицы либо представления (view) можно делать очевидно, с внедрением инструкции field. В данном примере для частей AttributeType этого созодать не надо, т.к. отображения на надлежащие поля производятся автоматом. Но для дочерних частей ElementType, которые по дефлоту связываются с таблицами, таковая инструкция быть может нужна. Более нередко применяемые инструкции приведены дальше.

сейчас можно перейти к самому шаблону. Представим, аннотированную схему вы сохранили под именованием MySchema.xml.

ПРИМЕЧАНИЕ

IIS различает тип XML-документа лишь на базе каталога, где он находится. Даже если мы не настроили особым образом IIS на выполнение схем, их лучше хранить в одном месте. Я рекомендую хранить схемы и шаблоны в различных виртуальных каталогах. к примеру, template для шаблонов, schema – для схем.

Вот так смотрится шаблон, выбирающий имена, фамилии и адреса всех создателей:

<my_root xmlns:sql=»urn:schemas-microsoft-com:xml-sql»>

<sql:xpath-query mapping-schema=»../Schema/MySchema.xml»>

/Authors

</sql:xpath-query>

</my_root>

Потому что схемы XDR равномерно вытесняются схемами XSD, перепишем пример с внедрением XSD.

ПРЕДУПРЕЖДЕНИЕ

Я полтора денька растерял, когда 1-ый раз пробовал выполнить запрос XPath на XSD-схеме. ISAPI-расширениеупорновыдавалоошибку «XPath: unable to find /authors in the schema». В конце концов, опосля недолговременных консультаций с одним из участников форума веб-сайта www.sql.ru, неувязка была решена. Сущность ее в последующем: при разработке виртуального каталога я употреблял оснастку mmc SQL IIS Admin.MSC, которая заходит в обычный набор MS SQL Server’а и ничего не понимает о новейших способностях SQLXML 3.0. Новенькая оснастка лежит в %Program Files%SQLXML 3.0 и именуется sqlisad3.msc. Ее можно запустить из меню Start->Programs->SQLXML 3.0->Configure IIS Support. Всегдапользуйтесьтолькоею.

Вот перечень главных различий XDR от XSD[9], к которому я весьма нередко обращаюсь:

XDR
XSD

Schema
schema

ElementType
element

AttributeType
attribute

attribute
none

С учетом этого схема будет смотреться так:

<xsd:schema xmlns:xsd=»HTTP://www.w3.org/2001/XMLSchema»

xmlns:sql=»urn:schemas-microsoft-com:mapping-schema»>

<xsd:element name=»authors» sql:relation=»authors»>

<xsd:complexType>

<xsd:attribute name=»au_fname» sql:field=»au_fname» />

<xsd:attribute name=»au_lname» sql:field=»au_lname» />

<xsd:attribute name=»address» sql:field=»address» />

</xsd:complexType>

</xsd:element>

</xsd:schema>

тут очевидно указаны инструкции, дозволяющие связать XML-элементы с таблицей authors и надлежащими полями. В данном случае они все не неотклонимы, т. к. SQLXML может вывести связи из заглавий узлов. Вот вам наглядный пример, где инструкции вправду нужны. Для контраста адресок и фамилия вынесены в отдельные элементы:

<?xml version=»1.0″ encoding=»windows-1251″ ?>

<xsd:schema xmlns:xsd=»HTTP://www.w3.org/2001/XMLSchema»

xmlns:sql=»urn:schemas-microsoft-com:mapping-schema»>

<xsd:element name=»Создатели» sql:relation=»authors»>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=»Фамилия» sql:field=»au_lname»/>

<xsd:element name=»адресок» sql:field=»address» />

</xsd:sequence>

<xsd:attribute name=»имя» sql:field=»au_fname»/>

</xsd:complexType>

</xsd:element>

</xsd:schema>

Если схема находится в виртуальном каталоге, тип которого schema, вы сможете делать XPath-запросы, конкретно указывая их в URL. Результирующий документ может не иметь корневого элемента, потому не запамятовывайте указывать параметр root.

HTTP://server/server_pubs/schema/xsd_map_schema.xml/Создатели?root=root

Вот остальные инструкции, нередко применяемые в схемах:

relationship – элемент, обозначающий связь с надлежащими друг другу первичными и наружными ключами. Употребляется для построения иерархических XML-документов.

is-constant – показывает, что соответственный элемент не связывается с таблицей либо колонкой базы данных.

map-field – булева переменная, принимающая

limit-field и limit-value – предусмотрены для указания поля и его значения, по которым будет фильтроваться запрос к базе данных. Итог использования этих инстракций аналогичен ограничению результирующего набора строк при помощи оператора WHERE.

use-cdata – показывает, что соответственный XML-узел будет представлен в секции CDATA результирующего документа. Узел должен быть связан с полем таблицы либо представления и не может применяться вместе с url-encode либо ID, IDREF, IDREFS, NMTOKEN и NMTOKENS.

hide – булева переменная, принимающая совершенно исключается из документа, так что не быть может применен в запросе XPath.

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

<?xml version=»1.0″ ?>

<xsd:schema xmlns:xsd=»HTTP://www.w3.org/2001/XMLSchema»

xmlns:sql=»urn:schemas-microsoft-com:mapping-schema»>

<xsd:annotation>

<xsd:appinfo>

<sql:relationship name=»PubsEmployees»

parent=»publishers» parent-key=»pub_id»

child=»employee» child-key=»pub_id» />

</xsd:appinfo>

</xsd:annotation>

<xsd:element name=»pubs» sql:relation=»publishers»>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=»employee»

sql:relation=»employee»

sql:relationship=»PubsEmployees» >

<xsd:complexType>

<xsd:attribute name=»First_Name» sql:field=»fname»

type=»xsd:string» />

<xsd:attribute name=»Last_Name» sql:field=»lname»

type=»xsd:string» />

<xsd:attribute name=»minit» sql:field=»minit»

type=»xsd:string» sql:hide=»1″ />

</xsd:complexType>

</xsd:element>

</xsd:sequence>

<xsd:attribute name=»PubName» sql:field=»pub_name» type=»xsd:string»/>

<xsd:attribute name=»City» sql:field=»city» type=»xsd:string»

sql:limit-field=»pub_name» sql:limit-value=»Binnet &amp; Hardley» />

</xsd:complexType>

</xsd:element>

</xsd:schema>

тут применен атрибут hide для удаления XML-узла из результирующего документа, но сохранить возможность его использования в XPath-запросах. Атрибуты limit-field и limit-value ограничивают количество издательств одним – «Binnet & Hardley». Раздел xsd:annotation вынесен, но его можно было употреблять и снутри узла <xsd:element name=»employee»…>. В таком случае имя элемента relationship можно было не указывать.

Приблизительно так можно употреблять эту схему:

HTTP://server/server_pubs/schema/schema1.xml/pubs/employee[@minit=»»]?root=root

Схемы можно конкретно указывать в шаблоне. к примеру:

<?xml version=»1.0″ encoding=»windows-1251″ ?>

<my_root xmlns:sql=»urn:schemas-microsoft-com:xml-sql»>

<xsd:schema xmlns:xsd=»HTTP://www.w3.org/2001/XMLSchema»

xmlns:ms=»urn:schemas-microsoft-com:mapping-schema»

id=»InLineSchema1″ sql:is-mapping-schema=»1″>

<xsd:element name=»Создатели» ms:relation=»authors»>

<xsd:complexType>

<xsd:attribute name=»имя» ms:field=»au_fname»/>

<xsd:attribute name=»Фамилия» ms:field=»au_lname»/>

<xsd:attribute name=»адресок» ms:field=»address»/>

</xsd:complexType>

</xsd:element>

</xsd:schema>

<sql:xpath-query mapping-schema=»#InLineSchema1″>

/Создатели

</sql:xpath-query>

</my_root>

Для того чтоб запрос XPath употреблял схему, также для сокрытия ее в результирующем документе XML, указан атрибут is-mapping-schema. Он может принимать значения 0 либо 1. Не считая этого, нужно очевидно сослаться на применяемую схему, потому что их в шаблоне быть может несколько. Это делается методом прибавления атрибута id в схему и атрибута mapping-schema – в раздел самого запроса.

Создание аннотированных схем не совершенно очевидная задачка, требующая к тому же познания огромного количества тонкостей. К Счастью, в Microsoft разработали особый инструмент для автоматической генерации схем – XML View Mapper. Его можно безвозмездно скачать по адресу HTTP://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/001/443/msdncompositedoc.xml . У него неплохой графический интерфейс и довольно хорошая документация; думаю, вы с ним разберетесь стремительно. Единственный его недочет – отсутствие способности сохранять схемы в формате XSD. Надеюсь, в дальнейшем эта возможность покажется.

К огорчению, SQL Server 2000 только отчасти поддерживает спецификацию XPath и способности использования XPath-запросов к базе данных. Ниже приведена сводка поддерживаемых и не поддерживаемых способностей.

Поддерживаемая функциональность XPath:

Тип
значения

Оси (axis)
attribute, child, parent, and self

Операторы сопоставления
=, !=, <, <=, >, >=

Арифметические операторы
+, -, *, div

Функции очевидного преобразования
number(), string(), Boolean()

Булевы операторы
And, or

Булевы функции
true(), false(), not()

Не поддерживаемая функциональность:

Тип
значения

Оси
ancestor, ancestor-or-self, descendant, descendant-or-self (//), following, following-sibling, namespace, preceding, preceding-sibling

Арифметические операторы
Mod

Строковые функции
string(), concat(), starts-with(), contains(), substring-before(), substring-after(), substring(), string-length(), normalize(), translate()

Булевы функции
lang()

Числовые функции
sum(), floor(), ceiling(), round()

Оператор объединения
|

Замечания по разделу

Вы сможете употреблять неограниченное количество обычных запросов (query) и запросов XPath (XPath-query) в одном шаблоне, также употреблять их вперемешку.

В качестве обычных запросов (query) могут выступать любые SQL-инструкции. Шаблоны могут быть применены для конфигурации данных, хотя это и не наилучшее решение. Остальные способы конфигурации данных рассматриваются в разделе Апдейтаграммы и XML Bulk Load.

место имен
Предназначение

urn:schemas-microsoft-com:xml-sql
Шаблоны и Инструкции XDR

urn:schemas-microsoft-com:xml-data
Схемы XDR

HTTP://www.w3.org/2001/XMLSchema
Схемы XSD

urn:schemas-microsoft-com:mapping-schema
Инструкции XSD

ADO и XML

Исторически самой первой и самой известной возможностью работы с XML-документами в ADO было сохранение объекта Recordset в формате XML. Ранее вы могли сохранять Recordset’ы лишь в бинарном формате adPersistADTG. Он употреблялся для передачи наборов строк средством RDS (Remote Data Services). работу с обоими форматами поддерживает OLE DB Persistence Provider. Не считая сохранения, можно также загружать (восстанавливать) объект Recordset из файлов. Сохранение и следующая загрузка рекордсета из файла в формате XML дали возможность использования XML-документов в качестве баз данных.

OLE DB Persistence Provider агрессивно задает формат результирующего XML-документа: для описания структуры и типов узлов постоянно употребляется XDR, данные постоянно помещаются в секцию data, а строчки представляются элементом row. Наименования и значения полей – надлежащие наименования и значения атрибутов элемента row. Нет никакой способности поменять этот формат, если он по любым причинам вас не устраивает. Можно, естественно, написать шаблон трансформации на XSLT, но это уже доп трудности.

С выходом ADO 2.5 возникла возможность сохранять рекордсет в IStream. Тяжело переоценить все плюсы этого нововведения: рекордсет сейчас можно было сохранять в объект DOMDocument, трансформировать XML-документ при помощи способа transformNode, добавлять свои элементы и атрибуты, и почти все другое. Не считая этого, вы могли сохранять рекордсет в поток Response объектной модели ASP, при этом как в формате adPersistADTG, так и в формате adPersistXML. В новейшей ADO 2.5 возник свой объект Stream (естественно, поддерживающий интерфейс IStream). С его помощью вы могли сохранять и загружать данные из файла на диске в бинарном формате (LoadFromFile и SaveToFile), загружать и сохранять данные в виде текста (ReadText и WriteText) и делать остальные не реляционные операции. Но достаточно истории, давайте перейдем к примерам.

Способности ADO 2.5

Сохранение и загрузка из файла в формате XML

Не мудрствуя коварно, возьму запрос из самого первого примера данной для нас статьи. Вот полный начальный текст vbs-скрипта:

Const adopenStatic = 3

Const adLockReadOnly = 1

Const adCmdText = 1

Const adPersistXML = 1

Dim rs

Set rs = CreateObject(«ADODB.Recordset»)

rs.Open «select au_fname,au_lname,address from authors where au_fname like ‘M%'», _

«Provider=sqloledb;Data Source=server;Initial Catalog=pubs;» & _

«User Id=user;Password=password;», adopenStatic, adLockReadOnly, adCmdText

rs.Save «c:myrs.xml», adPersistXML

Последующий пример показывает загрузку XML-документа в объект Recordset:

Const adopenStatic = 3

Const adLockReadOnly = 1

Const adCmdFile = 256

Dim rs

Set rs = CreateObject(«ADODB.Recordset»)

rs.Open «c:myrs.xml», «Provider=MSPersist;», adopenStatic, adLockReadOnly, adCmdFile

Трансформация при помощи DOMDocument

В этом примере создается ASP-страница, при воззвании к которой из базы будет избран Recordset и сохранен в объект DOMDocument. Дальше к документу будет использован шаблон трансформации, и результирующий html будет передан клиенту. Итог будет буквально таковым же, как в примере с трансформацией в разделе «URL-запросы». Код ASP:

<%

‘ Define some constant for ADO.

Const adopenStatic = 3

Const adLockReadOnly = 1

Const adCmdText = 1

Const adPersistXML = 1

‘ Creating objects

Dim rs,dom,stylesheet

Set dom = Server.CreateObject(«MSXML2.DOMDocument»)

Set stylesheet = Server.CreateObject(«MSXML2.DOMDocument»)

Set rs = Server.CreateObject(«ADODB.Recordset»)

‘ Open recordset

rs.Open «select au_fname,au_lname,address from authors where au_fname like ‘M%'», _

«Provider=sqloledb;Data Source=server;Initial Catalog=pubs;» & _

«User Id=user;Password=password;», adopenStatic, adLockReadOnly, adCmdText

‘ Save recordset to DOMDocument

rs.Save dom,adPersistXML

‘ Loading stylesheet

stylesheet.async = false

stylesheet.load «C:Inetpubwwwrootserver_pubsformat_for_ado.xsl»

‘ Perform transformation

Response.Write dom.transformNode(stylesheet)

‘ Cleanup

Set dom = nothing

Set stylesheet = nothing

Set rs = nothing

%>

Шаблон трансформации фактически не поменялся:

<?xml version=»1.0″ ?>

<xsl:stylesheet xmlns:xsl=»HTTP://www.w3.org/TR/WD-xsl» version=»1.0″>

<xsl:template match = «*»>

<xsl:apply-templates />

</xsl:template>

<xsl:template match = «z:row»>

<li>

<table><tr>

<td><xsl:value-of select = «@au_fname» /></td>

<td><xsl:value-of select = «@au_lname» />.</td>

<td>Address: <xsl:value-of select = «@address» /></td>

</tr></table>

</li>

</xsl:template>

<xsl:template match = «/»>

<html>

<body>

<ul>

<xsl:apply-templates select = «xml/rs:data» />

</ul>

</body>

</html>

</xsl:template>

</xsl:stylesheet>

Выдача Recordset’а в формате XML конкретно в поток Response

Разглядим совершенно легкий пример выдачи рекордсета в объект Response модели ASP.

<%

‘ Should specify this

Response.ContentType = «text/xml»

‘ Define some constant for ADO.

Const adopenStatic = 3

Const adLockReadOnly = 1

Const adCmdText = 1

Const adPersistXML = 1

Dim rs

Set rs = Server.CreateObject(«ADODB.Recordset»)

‘ Open recordset

rs.Open «select au_fname,au_lname,address from authors where au_fname like ‘M%'», _

«Provider=sqloledb;Data Source=server;Initial Catalog=pubs;» & _

«User Id=user;Password=password;», adopenStatic, adLockReadOnly, adCmdText

‘ Save recordset to Response stream

rs.Save Response,adPersistXML

Set rs = nothing

%>

Этот очень обычный пример показывает богатые способности манипулирования результирующим набором строк на клиенте. Разглядим внедрение объекта RDS.DataControl.

ПРИМЕЧАНИЕ

Может быть, эффективнее для RDS употреблять формат adPersistADTG, но XML для этого также отлично подступает.

Пример взят из MSDN и слегка изменен:

<html>

<HEAD><TITLE>Пример ADO Recordset Persistence</TITLE></HEAD>

<BODY>

<OBJECT CLASSID=»clsid:BD96C556-65A3-11D0-983A-00C04FC29E33″ ID=»RDC1″

<PARAM NAME=»URL» VALUE=»HTTP://yourserver/XMLPersist/XMLResponse.asp»>

</OBJECT>

<TABLE DATASRC=»#RDC1″>

<TR>

<TD><SPAN DATAFLD=»au_fname»></SPAN></TD>

<TD><SPAN DATAFLD=»au_lname»></SPAN></TD>

<TD><SPAN DATAFLD=»address»></SPAN></TD>

</TR>

</TABLE>

</BODY>

</html>

А ах так сделать на клиенте точную копию отправленного рекордсета (код на vbs):

Dim rs

Set rs = CreateObject(«ADODB.Recordset»)

rs.Open «HTTP://server/server_dir/sql2xml.asp»

Способности ADO 2.6

В данной для нас версии библиотеки возникла возможность делать при помощи объекта Command не только лишь SQL-запросы, да и XML-шаблоны и запросы XPath. Для этого было введено новое свойство Dialect. Дальше приведены все известные на нынешний момент значения этого характеристики [10].

Тип команды
запрос XPath
{EC2A4293-E898-11D2-B1B7-00C04F680C56}

запрос в XML-шаблоне
{5D531CB2-E6Ed-11D2-B252-00C04F681B71}

сейчас не постоянно может иметь реляционный нрав, его недозволено помещать в объект Recordset. Заглавие новейшего обычного характеристики Output Stream гласит само за себя: итог выполнения объекта Command быть может сохранен в потоке (любом объекте, поддерживающим интерфейс IStream). Не считая этого, так как запрос (свойство CommandText) сейчас может представлять собой запрос XPath, необходимо как-то задать аннотированную схему для него. Это делается при помощи обычного характеристики Mapping Schema. Пора перебегать к примерам.

Внедрение Command для формирования XML-документа на сервере

В этом примере показано, как сформировать XML-документ на сервере и выслать его клиенту с внедрением ADO:

<%

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

Const adopenStatic = 3

Const adLockReadOnly = 1

Const adCmdText = 1

Const adPersistXML = 1

Const adExecuteStream = &H400

‘ созданиеобъектов

Dim cmd,conn

Set cmd = Server.CreateObject(«ADODB.Command»)

Set conn = Server.CreateObject(«ADODB.Connection»)

conn.Provider = «sqloledb»

conn.Open «Data Source=server;Initial catalog=pubs;», «User«, «password»

Set cmd.ActiveConnection = conn

cmd.CommandType = adCmdText

cmd.CommandText = «select au_fname, au_lname, address » _

& «from authors where au_fname like ‘M%’ for xml auto»

cmd.Properties(«Output Stream») = Response

cmd.Properties(«xml root») = «root»

cmd.Execute , , adExecuteStream

Set cmd = nothing

Set conn = nothing

%>

тут употребляется интегрированная инструкция FOR XML AUTO для формирования XML-документа на SQL Server’е. В результирующем документе отсутствует корневой элемент, и для его указания употребляется очередное обычное свойство – xml root. В качестве выходного потока был применен объект Response. Итог воззвания к данной для нас ASP-страничке вы, наверняка, уже издавна выучили назубок: это будет XML-документ с именами, фамилиями и адресами создателей.

Выполнение шаблона

Возьмем шаблон из первого примера раздела «Шаблоны» (код на ASP):

<%

необходимо указать это:

Response.ContentType = «text/xml»

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

Const adCmdText = 1

Const adExecuteStream = &H400

‘ Создаемобъекты

Dim cmd,conn

Set cmd = Server.CreateObject(«ADODB.Command»)

Set conn = Server.CreateObject(«ADODB.Connection»)

conn.Provider = «sqloledb»

conn.Open «Data Source=server;Initial catalog=pubs;», «User