45889 (Использование XML совместно с SQL), страница 2
Описание файла
Документ из архива "Использование XML совместно с SQL", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "45889"
Текст 2 страницы из документа "45889"
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