45889 (665212), страница 2
Текст из файла (страница 2)
relationship – элемент, обозначающий связь с соответствующими друг другу первичными и внешними ключами. Используется для построения иерархических XML-документов.
is-constant – указывает, что соответствующий элемент не связывается с таблицей или колонкой базы данных.
map-field – булева переменная, принимающая значение 0 или 1. Значение 0 указывает, что соответствующий элемент не будет присутствовать в результирующем документе. С выходом SQLXML 3.0 аннотация была переименована в mapped.
limit-field и limit-value – предназначены для указания поля и его значения, по которым будет фильтроваться запрос к базе данных. Результат использования этих аннотаций аналогичен ограничению результирующего набора строк с помощью оператора WHERE.
use-cdata – указывает, что соответствующий XML-узел будет представлен в секции CDATA результирующего документа. Узел должен быть связан с полем таблицы или представления и не может применяться совместно с url-encode или ID, IDREF, IDREFS, NMTOKEN и NMTOKENS.
hide – булева переменная, принимающая значение 0 или 1. Указывает на то, что соответствующий XML-узел будет скрыт (значение 0) в результирующем XML-документе, однако может быть использован в запросе XPath. Не путайте её с аннотацией mapped. Различие в том, что при помощи mapped XML-узел совсем исключается из документа, так что не может быть использован в запросе XPath.
Рассмотрим пример, демонстрирующий работу некоторых из перечисленных аннотаций. В разделе FOR XML EXPLICIT был составлен иерархический список издательств и служащих, которые в них работают. Попробуем получить такой же XML-документ с помощью аннотированной схемы:
| xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> parent="publishers" parent-key="pub_id" child="employee" child-key="pub_id" /> sql:relation="employee" sql:relationship="PubsEmployees" > type="xsd:string" /> type="xsd:string" /> type="xsd:string" sql:hide="1" /> sql:limit-field="pub_name" sql:limit-value="Binnet & Hardley" /> |
Здесь использован атрибут hide для удаления XML-узла из результирующего документа, но сохранить возможность его использования в XPath-запросах. Атрибуты limit-field и limit-value ограничивают количество издательств одним – «Binnet & Hardley». Раздел xsd:annotation вынесен, однако его можно было использовать и внутри узла . В таком случае имя элемента relationship можно было не указывать.
Примерно так можно использовать эту схему:
| http://server/server_pubs/schema/schema1.xml/pubs/employee[@minit=""]?root=root |
Схемы можно непосредственно указывать в шаблоне. Например:
| xmlns:ms="urn:schemas-microsoft-com:mapping-schema" id="InLineSchema1" sql:is-mapping-schema="1"> /Авторы |
Для того чтобы запрос 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:\Inetpub\wwwroot\server_pubs\format_for_ado.xsl" ' Perform transformation Response.Write dom.transformNode(stylesheet) ' Cleanup Set dom = nothing Set stylesheet = nothing Set rs = nothing %> |
Шаблон трансформации практически не изменился:
|
| . | Address: |
Выдача 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 и слегка модифицирован:
| Пример ADO Recordset Persistence
|
А вот как создать на клиенте точную копию отправленного рекордсета (код на vbs):
| Dim rs Set rs = CreateObject("ADODB.Recordset") rs.Open "http://server/server_dir/sql2xml.asp" |
Возможности ADO 2.6












