- •Iis и xml функции sql Server
- •Поддержка xml в Microsoft sql Server 2000
- •Примеры
- •Iis и xml функции sql Server
- •Шаблоны
- •Запросы xPath
- •Замечания по разделу
- •Возможности ado 2.5 Сохранение и загрузка из файла в формате xml
- •Трансформация с помощью domDocument
- •Выдача Recordset’а в формате xml непосредственно в поток Response
- •Возможности 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-выражения
- •Кванторные выражения
- •Сортировка
- •Заключение
- •Литература
Тестовый проект
Давайте создадим небольшое тестовое Intranet-приложение, которое закрепит наши знания в этой области. Я предлагаю создать простенький форум, так как он позволит нам продемонстрировать наиболее характерные особенности SQLXML.
Цели и ограничения
Форум должен быть создан без единой строчки серверного кода, т.е. кода на ASP или ASP.NET. Вся серверная логика должна реализовываться с помощью хранимых процедур, которые должны быть доступны клиенту как Web-методы. Данные клиенту должны передаваться в формате XML с помощью шаблонов SQLXML. Преобразование XML в HTML будет производиться на основе XSLT-схемы, также на клиенте. Форум должен поддерживать персонализацию, т.е. возможность регистрироваться и создавать авторские сообщения. Сообщения может просматривать любой посетитель, но для создания нового сообщения необходима учетная запись. Сама страничка сообщений должна поддерживать разбивку на страницы. При этом пользователь может сам задавать размер страницы, т.е. количество сообщений на ней.
В силу того, что никакие серверные технологии не используются, поддержка сессий и приложений отсутствует.
Дизайн
Начнем с проектирования структуры базы данных. В приложении будут участвовать объекты: пользователи, роли пользователей и сообщения. Связь между пользователями и ролями – «многие ко многим», а между сообщениями и пользователями – «многие к одному». К атрибутам пользователя относятся: имя, полное имя, дата регистрации и пароль. Имя пользователя и пароль должны быть уникальными. Кроме этого, ни пароль, ни имя не должны допускать пустых строк. К атрибутам сообщения относятся: дата создания сообщения, тело сообщения и заголовок сообщения. Диаграмма таблиц представлена на рисунке 4.
Рисунок
4. Диаграмма таблиц БД.
Для работы с таблицами необходимы хранимые процедуры, которые будут доступны как Web-методы. Их, как и таблиц, немного:
AddMessage – добавление сообщения. В качестве параметров передается идентификатор пользователя, заголовок и тело сообщения.
AddUser – регистрация пользователя. В качестве параметров передается имя пользователя, пароль и полное имя.
IsUserRegistered – проверка пользователя. В качестве параметров передается имя пользователя и его пароль.
Полный скрипт создания БД SForum, всех таблиц, хранимых процедур и пользователя (SForumUser), учетная запись которого будет использоваться для доступа к базе, можно найти среди прилагающихся к статье файлов.
Наше Web-приложение будет состоять из нескольких файлов:
Board.htm – главная страничка форума, на которой расположены сообщения. Сообщения загружаются постранично через шаблон board.xml.
Login.htm – страничка входа в систему. Открывается со страницы board.htm модально. Для проверки пользователя вызвает метод IsUserRegistered. Возвращает результат (имя пользователя и его идентификатор) через свойство returnValue.
Register.htm – страничка регистрации пользователя. Открывается со страницы login.htm модально. Для регистрации пользователя вызывает метод AddUser. Возвращает результат (имя пользователя и его идентификатор) через свойство returnValue.
Post.htm – страничка создания нового сообщения. Открывается модально со страницы board.htm. Для создания сообщения вызывает метод AddMessage.
Диаграмма сайта приведена на рисунке 5.
Рисунок
5. Диаграмма сайта.
Сообщения будут передаваться на страницу board.htm в формате xml, с помощью шаблона board.xml. Если вы не знакомы с шаблонами SQLXML, прочитайте соответствующий раздел первой части статьи.
Формат XML-документа, представляющего сообщения:
<board> <info .../> <message posted="дата создания сообщения" author="автор сообщения" title="заголовок" id="идентификатор сообщения"> тело сообщения </message> </board> |
Придется учитывать тот факт, что пользователь может задавать количество сообщений на странице. Я создал дополнительный элемент info для хранения служебной информации, такой как, например, общее количество страниц при заданном размере страницы. С учетом всего вышесказанного, шаблон выглядит так:
Board.xml
<?xml version="1.0" encoding="windows-1251" ?> <board xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:header> <sql:param name="Page">0</sql:param> <sql:param name="PageSize">10</sql:param> </sql:header> <sql:query> exec GetMessages @Page,@PageSize </sql:query> <sql:query> select 1 as tag,0 as parent, (count(*)-1)/@PageSize + 1 as 'info!1!pages' from Messages for xml explicit </sql:query> </board> |
Страницы отсчитываются с нуля, а количество сообщений на странице по умолчанию равно десяти. Для генерации сообщений я использовал дополнительную хранимую процедуру GetMessages.
