Книги, научные публикации Pages:     | 1 | 2 | 3 | 4 | 5 |

том 1 альманах программиста Тематический сборник материалов Library и Magazine ADO.NET SQL Доступ к из приложений Составитель Ю. Е. Купцевич Москва 2003 fii. P У С P i К УДК 004.45 ББК ...

-- [ Страница 3 ] --

Х создавать и использовать команды, наборы записей (recordsets) и другие объекты для доступа к данным и управления ими;

Х форматировать и преобразовывать данные с помощью функций, про цедур и СОМ-объектов;

Х создавать, изменять и использовать значения, хранящиеся в глобаль ных переменных DTS и в константах ActiveX-сценариев;

Х включать другие задания и рабочие процессы DTS.

данных и отчетов Server 2000...

Приложение-пример Наш пример как использовать VBScript-задания для нения функций, недоступных в других заданиях DTS, и каким образом сделать так, чтобы VBScript-сценарий работал в качестве задания, выпол няемого по расписанию (scheduled task). Мы не будем рассматривать гло бальные переменные DTS, рабочие процессы или интеграцию с другими заданиями, так как наша цель Ч продемонстрировать мощь VBScript в SQL Server 2000.

Данные данных SQL Server) Т s Создание в Т на VBScript и рассылки данных почте) i как по расписанию Рис. 1. Создание и конфигурирование DTS-приложения Рис. 1 иллюстрирует схему, которой мы придерживались при разработке приложения-примера DTS. VBScript-задание периодически рассылает авторам по электронной почте информацию по продажам их книг. Данные форматируются в отчет. В качестве источника данных мы взяли базу данных с SQL Server 2000, но наша мето дика носит универсальный характер и применима к любой модели данных.

Microsoft Server Первый шаг Ч заполнение поля адреса электронной почты соответствую щим адресом автора. Как показано на рис. 2, для этого мы выбираем базу данных Pubs и расширяем таблицу authors, добавляя в нее поле типа размером 20 Мы исходим из того, что в реальном приложении это поле будет заполняться через отдельный GUI-интерфейс или но в демонстрационных целях адреса можно вводить и вручную.

on phone char V ! V chat 2 V !l 75 V г Рис. 2. Добавление поля адреса электронной почты Далее мы создаем новый локальный DTS-пакет в SQL Server 2000. Как показано на рис. чтобы вызвать DTS Designer для создания пакета, нуж но запустить Enterprise Manager в SQL Server, дерево консоли Data Transformation Services правой кнопкой мыши и выбрать команду New Package. С помощью GUI-интерфейса DTS Designer можно создавать и конфигурировать пакеты, перетаскивая мышью нужные методы и запол няя страницы свойств различных DTS-объектов, образующих пакет.

Третий этап (рис. 4) Ч добавление VBScript-задания перетаскиванием ActiveX Script Task с панели инструментов Task в рабочую область дизай на иллюстрации хорошо видно, что поле имеет тип char и длину 75 символов. Ч Прим. сост.

данных и предоставление отчетов SQL Server нера. Вы можете изменить имя задания с ActiveX Script Task;

undefined на что-нибудь более подходящее вам.

I V !. - В. NT) Data Х Х Рис. З. Создание пакета.

Visual ale:

Sales Repent should have | and Const ADO to ц Рис. 4. Свойства Microsoft SQL Server Теперь надо написать на VBScript функции для выборки, преобразования и отправки данных по электронной почте. Чтобы облегчить изучение при ложения-примера, просто скопируйте эти функции из исходного кода (см.

ссылку в конце статьи). что в окне свойств ActiveX Script Task выбран язык VBScript. Язык указывается на вкладке Language (рис. 4).

Затем скопируйте наш исходный код в дизайнер, удалив код функции main, предлагаемый по умолчанию.

Кроме того, чтобы наше приложение заработало, надо изменить констан ты в SQL Server, так как у них могут быть различные значения (об этом Ч позже).

После выполнения всех операций сохраните пакет, как показано на рис. 5.

Мы присвоили ему имя BookSales.

Рис. 5. Сохранение пакета Запустить приложение-пример можно несколькими способами, Сначала щелкните кнопку Parse, чтобы убедиться в отсутствии синтаксических ошибок. Эта кнопка находится в окне свойств ActiveX Script Task. Затем щелкните кнопку Go* на панели инструментов в верхней части окна DTS Designer. Еще один вариант Ч щелкнуть нужное задание правой кнопкой мыши и выбрать из контекстного меню команду Execute step. Кроме того, пакет BookSales можно выполнить в Enterprise Manager (рис. 6). При ус пешном выполнении задания авторы будут получать электронную почту в с расписанием (рис. 7).

Эта кнопка Execute. Ч Преобразование и предоставление отчетов SQL Server SQL - { Рис. 6. Запуск пакета BookSales Рис. 7. Расписание передачи по электронной почте 186 Microsoft SQL Server Чтобы пакет запускался по расписанию, выбери те из контекстного меню команду Schedule Package (рис. 6) и в появившемся окне нужные параметры.

Пакет BookSales будет запускаться ежедневно в вечера, начиная с 01.01.2002, и предоставлять о номерах заказов, количестве пози виде платежа и названиях книг. Обратите внимание: необходимо за пустить SQL Server Agent и настроить его на запуск пакетов DTS по рас писанию. Вы увидите пакет BookSales как задание в Enterprise Manager в узле дерева консоли Management SQL Server Agent j Jobs.

Код на VBScript Исходный код нашего примера находится в файле SourceCode.txt. После того как мы поясним константы, которые нужно задать, и кратко рассмот рим функцию main, мы расскажем, как этот код обрабатывает данные по продажам, обращается к базе данных, форматирует набор записей и от правляет отчеты.

Следующим трем константам нужно присвоить значения, соответствую щие параметрам вашей системы и сети:

Const Const = Book Sales Reporting & Const & "Initial id = Первая константа, Const = "exchange.afs-link.com", сооб щает DNS-имя вашего SMTP-сервера (почтового сервера). Эта информа ция нужна для отправки электронной почты;

ее можно получить у вашего сетевого администратора.

Const = Sales Reporting Service"

Последняя константа Ч строка подключения (connection string) к базе данных, содержащая всю информацию, необходимую для соединения с базой данных. Строка подключения в ADO выглядит примерно так:

данных и SQL Server 2000 Const = & _ Initial id = & Мы исходим из что читатель знаком с основами ADO, и поэтому лишь кратко описываем каждую часть строки подключения.

Элемент указывает драйвер базы данных. В нем определяется тип нужного для подключения к базе данных. Мы используем SQL Server. Если ваше приложение работает с ба зами данных другого типа, информацию об ODBC-драйвере можно найти по ссылке Элемент Data Source задает местонахождение сервера. Мы указали в нем local, так как у нас SQL Server находится на локальном компьютере. В ином случае может потребоваться IP-адрес или имя компьютера, на кото ром размещена база данных.

Initial Catalog содержит имя базы данных;

в нашем примере это Pubs, ко торая поставляется с SQL Server. Наконец, user id определяет имя пользо a password Ч его пароль.

По умолчанию точкой входа в ActiveX-задание является функция main, но может быть и любая другая. Функция main состоит всего из двух строк.

Сначала она вызывает процедуру Process_Daily_Sales, а затем возвращает константу, используемую в ActiveX-сценариях, Ч cess. В Package Object Browser можно посмотреть все константы проекта и глобальные переменные (рис. 8).

Эти константы и глобальные переменные позволяют управлять выполне нием операций в DTS-пакете. Мы не будем подробно описывать эти кон станты и переменные. Важно, что функция main возвращает константу поскольку в нашем примере ние выполняет всего одну операцию.

Обработка данных по продажам Функция Ч главная часть нашего приложения. Она извлекает набор записей со списком авторов, книги которых продавались в течение сегодняшнего дня. Затем она форматирует этот набор записей как HTML-таблицу и отправляет ее соответствующим авторам.

Функция содержит три локальных переменных (два набора записей ADO и одну дату):

Microsoft SQL Server Й S Sales Report have !Х Я Mail Address and SI to ' Name:

Script Call Х..

С A 1 J Рис. 8. Константы проекта Dim Dim Так как не все базы данных Pubs содержат данные по продажам за сегод няшний день, следующие две строки кода генерируют отчет за 14.09.1994.

Отчет за эту дату можно получить почти в любой базе данных Pubs. Мы просто убрали признак комментария из строки кода для даты и закомментировали строку с сегодняшней датой:

= & Todays_Date = Преобразование данных SQL Server 2000... Для выборки авторов, книги которых были проданы сегодня, использует ся несложный запрос, объединяющий несколько таблиц:

strAu_Sales = "Select Distinct & Where = and & = and & = & Todays_Date Далее получаем набор записей ADO, соответствующий этому оператору SQL:

Set = Затем, прежде чем проходить по набору записей rstAuthors и авторов, убеждаемся, что этот набор записей не пуст:

If Not and ) Then While Not Мы извлекаем и другую информацию: магазин, принявший заказ, номер заказа, количество позиций, вид платежа и книг. Эта информа ция берется из таблиц Stores, Sales, TitleAuthors и Titles. Как видите, и здесь выполняется простое объединение таблиц* :

= "SELECT distinct as [Store Name], & as [Order Number], as [Quantity], & as [Pay Terms], Stores, Sales, & _ "TitleAuthor, Titles & "Where = & & and & Todays_Date & "and = and = & И в этом случае мы получаем набор записей ADO, выполняя оператор Execute SQL:

Set Теперь формируем тело сообщения с именем и адресом автора. Для этого используется HTML-тэг
, так как нам нужен формат HTML:

strTable = & & & & & & & & & Этот исправлен в соответствии с кодом, из файла Ч Прим. сост.

190 SQL Server Тело сообщения готово. Теперь встраиваем в него HTML-таблицу, жащую ранее полученные данные по продажам. Функция Recordset преобразует набор записей в strTable = Далее вызываем функцию отправки электронной почты, параметрами ко торой являются тема сообщения, электронный адрес автора и тело сообще ния в формате HTML:

Call Sales Report For: & strTable) Затем переходим к следующему автору:

Функция подключается непосредственно к базе данных. В этой функции мы обращаемся к базе данных, выполняем передаваемую при вызове строку SQL и возвращаем результаты (если они есть). Снача ла создаем ADO-соединение:

Set myConn = Затем набор записей ADO:

set = На следующем этапе открываем соединение, используя константу DB_CONNECT_STRING:

= Открыв соединение, открываем набор записей:

myConn И, наконец, возвращаем результат:

ExecuteSQL = Если у вас есть опыт работы с ADO, все эти будут для вас очень просты.

Функция получает к качестве параметра набор записей ADO и HTML-таблицу (в виде строковой переменной). В ней три цикла, причем третий цикл вложен во второй. В первом цикле пере бирается список полей и формируется заголовок таблицы. Затем таблица Преобразование данных SQL Server 2000... заполняется данными;

при этом внешний цикл проходит по внут ренний Ч по полям. В итоге набор записей преобразуется в HTML-таблицу.

HTML-таблица создается как строка. Эта простая таблица определяется так:

strTable = border= Затем переходим на первую запись и создаем строку таблицы, используя тэг :

strTable = strTable & Затем проходим по полям и добавляем в таблицу имена полей с помощью тэга , выделяя их цветом:

For Index = 0 То - strTable = strTable & bgcolor=blue & strTable = strTable & strTable = strTable & Next Закрываем тэг и таким образом завершаем формирование заголовка таблицы:

strTable = strTable & Теперь, чтобы заполнить HTML-таблицу информацией, обрабатываем данные, хранящиеся в наборе записей. Проходим по всем записям и запол няем HTML-таблицу тэгами и :

While (Not strTable = strTable & For = 0 To - strTable = strTable & strTable = strTable & strTable = strTable & strTable = strTable & Next strTable = strTable & Wend Наконец таблица заполнена. Осталось вернуть значение функции Ч пере менную строкового типа:

192 Microsoft SQL Server = & = strTable Отправка отчетов Для отправки отчетов авторам служит функция Send_Email. Заметьте, в ней используются константы и а так же Microsoft Collaboration Data Objects (CDO 2.0) из CDOSYS.DLL.

предоставляет объектную модель для разработки коммуникационных при ложений в Windows 2000, базируется на стандартах SMTP и NNTP и дос тупен как системный компонент при установке Windows 2000 Server. Это стандартный API для создания приложений массовой рассылки и переда чи почтовых сообщений через Web, Такие приложения работают под уп равлением Windows 2000 Server.

У функции три параметра: subject, rcpt и msgHTML. Первый Ч это тема отправляемого сообщения, второй Ч электронный адрес получа теля, а третий Ч тело сообщения в формате HTML.

В также используются две другие константы:

(указывает, что сообщение должно быть отправлено локаль ный каталог службы SMTP) и (указывает, что сообще ние должно отправлено по сети).

Если на локальном компьютере установлена служба SMTP, по умолчанию берется константа В ином случае (если установлен Outlook Express) Ч константа cdoSendUsingPort и параметры учетной за писи по умолчанию (default account). Мы используем cdoSendUsing Pickup.

Далее в создаются Message и Configuration:

set = set iConf = У объекта Configuration несколько полей. Перед присвоением значений эти поля связываются с объектом Set = Большинство полей, используемых для задания конфигурации CDO определяется в пространстве имен Мы присваиваем значения трем полям (SendUsing, SMTP_SERVER и TimeOut) объекта Configuration:

With = данных и SQL Server 2000. Item( & _ = End Наконец, указываем, что будет только что опре деленную нами конфигурацию, заполняем остальные поля и отправляем сообщение:

With iMsg Set = rcpt = subject.HTMLBody = With Заключение В этой мы рассказали, как реализовать технологию доставки инфор мации на основе SQL Server 2000, VBScript, ADO, CDO и DTS-пакетов.

Наш пример прост, но функционален. Чтобы расширить его, вы могли бы использовать более сложную модель данных и внешние компоненты, по зволяющие отправлять пользователям более полные отчеты. Кроме того, вы могли бы интегрировать в VBScript-задание другие Ме тодика, описанная в этой статье, применима и к рассылке самой разнооб разной информации: регулярных финансовых отчетов, сведений о состоя нии заказов и любых других данных.

Исходный код для этой статьи можно скачать по ссылке:

Ч старший вице-президент и директор по техноло гиям в American Financial Systems Inc. (AFS) (Уэстон, штат Миннесота). С ним можно связаться по адресу amehta@afs-link.com.

Дэниел Уильяме (Daniel Williams) Ч заместитель вице-президента по технологиям в Deferral.com в составе AFS), а также инженер ПО, участвующий в проекте Deferral.com. С ним можно связаться по адресу Франческо Балена Автоматизация выполнения административных задач в SQL Server* SQL Server можно программно администрировать на основе системных хранимых процедур, но зачастую удобнее использовать современную объектно-ориентированную технологию DM0 Management В статье в SQL Server 7.0 и SQL Server 2000, а также объектная модель SQL-DMO. Основное внимание уделяется поддеревьям Databases и JobServer дерева этой модели. Примеры кода демонстрируют, как с помощью объектов вроде Registry, Configuration и Database автоматизировать выполнение типичных задач в том числе программное считывание параметров конфигурации, создание баз данных, запуск сценариев (scripts) T-SQL и копирование данных по расписанию.

Вместе с Microsoft SQL поставляется набор хранимых процедур для автоматизации административных операций (создания баз данных и таб лиц, резервного копирования и г. д.), Однако раньше бы понадобился опыт программирования на чтобы в полной мере задействовать эти возможности. С появлением (Distributed Management Objects) си туация изменилась. Теперь любой программист может решать такие зада чи, используя тот язык, который ему больше нравится.

SQL-DMO Ч это набор из примерно 150 объектов, отражающих практи чески все аспекты управления SQL Server 7.0 и SQL Server 2000. Эта объектная модель полностью поддерживает двойственные интерфейсы в Magazine. 2001. №5 Ч Прим. изд.

SQL Server (dual interfaces), поэтому она применима почти в любом языке, в том чис ле в Visual Basic, C++, VBScript, JScript, Windows Script Host и ASP-сценариях. В статье приводится исходный код, показывающий, как программно считывать параметры конфигурации, создавать запускать сценарии создавать задания на копирование и указывать расписание их выполнения. Основная часть кода написана на Visual Basic, но концепции, о которых рассказывается в статье, легко реа лизовать на любом другом языке программирования.

Обзор SQL-DMO С физической точки зрения, объектная модель реализована в SQL Вспомогательный файл содержит все локали зуемые ресурсы. В SQL Server 7.0 этот находится в каталоге (если при установке выбран путь, предлага емый по умолчанию), где хххх Ч десятичное значение идентификатора языка (например, 1033 для English), В SQL Server 2000 по умолчанию используется каталог SQL Server\80\Tools\ Упомянутые файлы копируются на диск стандарт ной программой установки SQL Server, так что для активизации дополнительных действий требуется. Кроме программа установ ки запускает сценарий (написанный на для уста новки нескольких системных необходимых Вы можете самостоятельно запустить его из каталога (для SQL Server 7.0) или Microsoft SQL (для SQL Server 2000), если полагаете, что эти процедуры были удалены или изме нены. DMO также в составе инструментальных средств, развертываемых на клиентских рабочих станциях. В файле в корневом каталоге установочного компакт-диска SQL Server содержит ся информация по и SQL-DMO.

Компонент SQLDMO.DLL обращается к (модулю абстрак ции базы данных), а тот Ч к которая в свою очередь вызы вает ODBC-драйвер SQL Server. ODBC-драйвер должен быть не ниже версии 3.70 (эта версия поставляется с SQL Server 7.0). Если определен псевдоним и вы указываете его в качестве имени сервера, то и SQL-DMO будет использовать этот псевдоним при поиске источника данных ODBC.

SQLDMO.DLL работает с протоколом по умолчанию, заданным через Client Network Utility, и не может самостоятельно перейти на другой се тевой протокол.

Объекты SQL-DMO верхних уровней Несмотря на большое количество объектов в DMO, эта модель удивитель но проста в использовании;

ее структура напоминает иерархию 196 Microsoft SQL Server SQL Server Enterprise Manager. Корнем является объект Application;

под ним находится объект ServerGroup, далее идет объект SQLServer. Все объекты верхних уровней модели показаны на рис. 1. У объекта SQLServer три Databases (включает все объек ты, нужные для создания и управления базами данных, таблицами, индек сами и т. д.), JobServer все объекты, предназначенные для опре деления заданий и расписаний их выполнения) и Replication (позволяет реплицировать базы данных, издателей и подписчиков и т. д.).

В этой статье основное внимание уделяется поддеревьям Database и JobServer.

Logins Server Roles Рис. 1. Объект Application Автоматизация выполнения задач в SQL Server Работа с объектами SQL-DMO Все объекты в иерархии SQL-DMO можно разбить на три большие груп пы: индивидуальные объекты (например, Database, Table и Column), набо ры (например, Databases, Tables и Columns) и списки. Объекты-списки аналогичны наборам, но не имеют встроенной поддержки для добавления и удаления элементов. Обычно списки Ч это значения, возвращаемые ме тодами или свойствами. Так, в следующем коде поле со списком (combo box) заполняется именами серверов:

Dim sqlApp As New Dim NL As Set NL = index = 1 To Next Для SQL Server 7.0 этот код выведет список серверов, которые работают под управлением Windows NT, используют протокол Named Pipes и нахо дятся в одном домене сети. (Так как при поиске серверов применяется широковещание по NetBIOS, список серверов может стать еще короче в зависимости от инфраструктуры маршрутизации. И еще одно: серверы SQL Server под управлением Windows не показываются, поскольку они не прослушивают пакеты по протоколу Named Pipes.) В SQL Server при поиске серверов наряду с широковещанием по NetBIOS применяется широковещание по поэтому в список попадут и те серверы, которые используют стек протоколов TCP/IP. Кроме того, если на локальном ком пьютере работает он тоже добавляется в список.

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

Подключение и отключение Для подключения к заданному экземпляру SQL Server нужно создать объект SQLServer, при необходимости присвоить подходящее значение полю LoginTimeout и вызвать метод Connect:

Dim SQLServer As New = If Then Аутентификация средствами Windows NT = strServer Else Microsoft SQL Server Аутентификация средствами SQL Server End If Как именно осуществляется подключение, зависит от вида аутентифика ции Ч через Windows NT или SQL Server.

В предыдущем фрагменте кода strServer Ч имя сервера, a strLogin и strPassword Ч имя и пароль при аутентификации через SQL Server. Учти те, что при неудачной попытке входа генерируется ошибка периода выпол нения, поэтому в реальных приложениях эти операторы надо защищать обработчиком ошибок.

В отличие от ADO-объекта Connection объект SQLServer при выходе из диапазона действия не закрывает соединение автоматически, поэтому, если вы сами его не закроете, оно остается открытым, пока не истечет вре мя ожидания. Весьма важно по работы с SQL Server отклю читься от него (вызовом поскольку формируемый кэш метаданных не уничтожается до отсоединения (хотя SQL Server 2000 по возможности пытается побыстрее освободить объекты кэша метаданных). Поэтому, чтобы не удерживала лишние ресурсы, тожайте все объекты явно:

set oDatabase = Nothing метаданных поддерживается индивидуально для каждого процесса, использующего (другими словами, кэш метаданных локален для процесса, в чьем адресном он размещается, и не разделя ется процессами, на одном компьютере).

Кроме того, с помощью объекта SQLServer можно в один прием запустить службу Microsoft SQL Server и подключиться к ней либо приостановить, или остановить ее выполнение (рис. 2). Пример на Visual Basic (stoplite), как реализовать эти операции, можно скачать по ссылке в разде ле за май. Получить текущее состояние службы позволяет свойство SQL Server. Status.

Объект SQLServer напрямую управляет службой Для за пуска и останова службы управляющей выполнением заданий по расписанию, нужно использовать объект SQLSe rve Для настройки служб SQL Server на автоматический запуск при загрузке операционной системы установите свойства объекта Registry:

Автоматизация задач в SQL = = True 2. и остановка выполнения службы Public Sub as Dim As Set oSQLServer = New = On Error Select Case Case 1 ' запуск = Then oSQLServer. Start False "Cannot start server, server is "running "SQL Server Service End If Case 2 ' If = Then "Cannot pause a server is running", & vbOKOnly, "SQL Server Service Manager" End If Case = Then ' "shutdown" ' и не использует диспетчер управления службами Else stop a server which not vbOKOnly, Server Service Manager" End If End Select Exit Sub & " & & & _ & " & & "SQL Server Service Manager" Иnd Sub 200 SQL Server Заметьте, что служба не работает в Windows 98, Windows 98 SE и Windows Me, так как в отличие от Windows NT в этих операционных системах нет диспетчера службами (Service Control Manager, SCM). (SQL Server 2000 больше не поддерживает Windows 95.) Соответ ственно в Windows 9x нет и учета взаимозависимостей служб, Объекты Registry и Configuration Объект Registry обеспечивает доступ ко многим важным параметрам, оп ределяющим каталог чувствительность к регистру букв, путь к базе данных master и имя владельца. Не удивитель что не все эти параметры можно изменить без переустановки SQL Server.

Объект Configuration открывает доступ к набору элементов Каждый элемент одному из примерно 40 параметров конфи гурации, значения которых можно просматривать и с помощью хранимой процедуры Но проще работать с этими значения ми, используя объектно-ориентированный подход. Так, следующий код выводит список значений основных и дополнительных параметров конфи гурации:

Dim cv As With = Each cv In Print Next End With Вы можете изменить параметр конфигурации и зафиксировать изменения, вызвав метод или ' Разрешаем системных таблиц With = End With Извлечение данных из объекта Не все параметры конфигурации так легко прочитать. Объект SQLServer содержит 10 методов возвращающих информацию об учетной записи, атрибутах сервера, группах в домене Windows NT и такие важные динамические данные, как сведения о процессах и текущих блокировках. Все методы возвращают объекты QueryResults.

Автоматизация в SQL Server Объект Results можно рассматривать как контейнер, хранящий один или несколько доступных только для чтения двухмерных массивов, из которых информация извлекается методом GetColumnString, или Get Column Double. этих методов довольно утоми тельно, потому что сначала нужно определить тип каждого столбца по свойству и только потом выбрать метод Однако есть более простой и быстрый способ извлечения данных из объ екта основанный на использовании метода Этот метод текст, который выводился бы в окне Query Analy zer при запросе той же информации через соответствующую хранимую процедуру (например, при получении списка и про цессов или при получении информации о текущих блокировках).

Полученную строку можно быстро обработать для извлечения нужных значений вызовом функции Split языка Visual Basic или VBScript.

На рис. 3 показана универсальная процедура, которая преобразовывает объект QueryResults в Recordset. Я решил использовать Recordset вместо, обычного двухмерного массива строк, так как это позволяет сразу же показать результаты, связав с Recordset элемент управления DataGrid (рис. 4).

Рис- 3. в Function As _ A. As String rs As New Recordset As As String Dim As As Long * Получаем в одной длинной строки со столбцами ' и записями, разделенными специальными Символами;

в данном ' случав необычные разделители " так как некоторые значения,,, ' строки содержит.

поля For = 0 To 1) Next см. след. стр.

SQL Server Рис. З. в Добавляем записи в запись, состоит символов заголовки = 2 То ' отдельные столбцы ' Добавляем For = 0 To Next " Recordset Set = End Function Рис. 4. Отображение SQLServer Ч не единственный член иерархии, объект QueryResults. Я насчитал в объектной модели SQL-DMO более методов получать практически любого вида, в том числе зависимости между объектами базы данных, под писки репликации (replication subscriptions), таблицы связанных и др. эти методы позволяют не только показывать результаты пользователю, но и решать более важные задачи. вы можете изощренные утилиты, оптимизировать работу сис темы за счет блокировок и процессов.

Объект Database Это, пожалуй, самый интересный с точки зрения разработчика объект в иерархии Получив на ссылку, вы можете создавать и уда задач в SQL Server лять все таблицы, представления, хранимые процедуры, пользователей и группы базы данных вплоть до отдельных столбцов, индексов и триггеров, перебирать эти объекты и изменять их (рис. 5).

Рис. 5. Объект Database Поскольку зависимые объекты в наборы, перебирать объекты очень легко. Так, код на рис. 6 перечисляет все таблицы (и их столбцы) данных Pubs, поставляемой с SQL Server.

У большинства объектов базы данных есть свойство возвра щающее True (если объект сгенерирован системой) или False (если объект определен пользователем), поэтому нетрудно при выводе только те объекты, которые вас интересуют:

Перечисляем все несистемные хранимые процедуры ' в базе данных Pubs и их определения на Dim sp As For Each sp In Microsoft SQL Server If Not Print PROCEDURE & Print End If Next Рис. 6. Список таблиц и их в данных Pubs ' что объект SQLServer к As As SQLDMO. Table col As db For tbl In Each col In Print " Next Создание и выполнение сценариев Многие объекты в том числе Database, Table, Index, Key, Job, Alert, Trigger, User, Check и большинство объектов со держат метод Script, который возвращает сценарий Т-SQL, генерирующий этот объект. Но что данный сценарий не создает внутренние ты. Например, следующий код создает сценарий, содержащий только оператор CREATE DATABASE и группу вызовов хранимой процедуры ' Получаем сценарий на Т-SQL базы данных Pubs Dim As Set pubsDB = Print Чтобы воссоздать всю структуру базы данных, необходимо вызвать метод Script для всех внутренних объектов иерархии Database, в частности для всех таблиц, представлений и хранимых процедур. Однако метод Script объекта-таблицы облегчает генерацию сценариев, создающих базы дан ных. Он принимает аргумент с набором битовых флагов, указывающих, надо ли также генерировать сценарии для создания индексов, ограничений (constraints), триггеров и внешних ключей (рис. 7).

выполняет один пакет (batch) единовременно и при анализе SQL-сценариев не проверяет наличие разделителей пакетов. Поэтому в Visual Basic сгенерированный сценарий нельзя выполнить с помощью ме Автоматизация задач в SQL Server Execute Immediate или любого другого метода не интер претируя сценарий самостоятельно. При программной генерации сценари ев очень удобно, что их можно обрабатывать как строки.

можно взять таблицу и создать новую таблицу с такой же структурой и другим именем (рис, 8).

Рис, 7. Генераций для ' для создания всех ' в базе данных Pubs и их объектов Dim As Dim As Long, As ' в библиотеке типов = Or Or Or _ For Each tbl In sql * sql & Next Рис. таблицы с той же структурой, что и у существующей ' Чтобы сценарий для таблицы о ' используйте параметр метода Script, ниже As Set * * "(local)" As Set = As String As Dim As ScriptOptionsI =, "New надо в контексте базы данных Pubs, чтобы разрешать " (resolve) в таблице sales типы данных, aw. след. стр.

206 Microsoft SQL Server Рис. 8. таблицы с той же структурой ' а также в sqlText оператора pubs" sqlText ' Для метода в контексте сервера удалите базу так как здесь это будет к ошибке ' отсутствия sqlText oSQLServer = Nothing Создание заданий и расписаний их выполнения Управление заданиями (jobs) и их выполнение по расписанию Ч та об ласть, где в полной мере проявляется полезность технологии И действительно вам, как нужно привести поведение SQL Server в соответствие с потребностями пользователей, а эти потребности часто меняются. Объекты поддерева иерархии (рис. 9) позволя ют разрабатывать клиентские приложения, которые дают возможность пользователям с помощью простого и удобного создавать и выполнять по расписанию комплексные задания, с обслуживанием базы данных.

В рамках одной статьи нельзя детально рассказать о каждом из дочерних объектов объекта JobServer, поэтому я сосредоточусь на самых важных и полезных из них;

объекте Job и зависимых от него объектах JobStep и Если вы знакомы с созданием заданий и настройкой распи сания их выполнения в SQL Server Enterprise Manager, вам будет неслож но применять эти объекты.

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

Создадим объект Job. присвоим свойствам Name и Descrip tion, а затем добавим этот объект в набор Jobs объекта JobServer:

Создаем и Job Dim As New = Backup" = "Check and Northwind" его в набор Jobs SQLJob Каждая операция задания (job step) в Enterprise Manager соответствует объекту JobStep иерархии SQL-DMO. задания бывают трех ти Автоматизация задач SQL Server команды команды Windows Script и команды операционной системы. Тип операции задается присвоением свойству Subsystem соот ветствующего строкового значения, TargetServers Рис. 9. Поддерево JobServer Вот например, создать операцию задания, команду DBCC применительно к базе данных Northwind:

Dim As Set aJobStep = New = "Step 1: Check Northwind" = "Northwind" = "DBCC CHECKDB = 208 Microsoft SQL Server Свойство OutputFileName служит для задания имени и пути файла, в ко торый выводятся данные при выполнении данной операции задания. При использовании этого свойства проблема: для каждой операции задания содержимое файла перезаписывается (тогда как Enterprise Mana ger позволяет дописывать информацию в конец файла). Это одна из не многих ситуаций, где модель менее гибка, чем Enterprise Mana ger. Такое ограничение можно обойти, используя для каждой операции задания свой временный файл, а потом объединяя их содержимое в файл реального вывода.

Чтобы указать, чем закончилось выполнение операции задания Ч успехом или ошибкой, вы присваиваете значения свойствам и Action соответственно- Эти свойства принимают одно из четы рех значений перечислимого типа:

или Допустим, если команда CHECKDB выполнена успешно, нужно перейти к следующей (второй) операции, а при неудаче задание требует ся завершить:

= = Можно перейти и к любой другой операции, но для этого надо присвоить значение свойства этой операции свойству OnSuccessStep или Если DBCC CHECKDB потерпит неудачу, к 3-й операции = Закончив определение текущей операции задания, добавьте объект Job Step в набор JobSteps родительского объекта Job:

aJobStep Теперь можно определить остальные операции задания. Например, на рис. 10, если команда DBCC CHECKDB завершилась успешно, вторая операция выполняет резервное копирование базы данных, а третья Ч за пускает ActiveX-сценарий, объединяющий вывод предыдущих операций в файл журнала приложения. Для запуска ActiveX-сценария свойству Sub System объекта JobStep присваивается значение свой ству Ч имя языка сценариев (VBScript или а свой ству Command Ч код сценария. (Можно также выполнить команду опера ционной системы, присвоив свойству Subsystem строку a свойству Command Ч текст команды операционной системы. Скажем, для в SQL Server запуска служб, отвечающих за работу с Интернетом, свойству Command присваивается значение IISRESET START.) Рис. 10. базы ее резервное копирование и генерация файла журнала * - к объект Job Dim = "Check and Backup ' Добавляем объект в Jobs Add ' - Первая проверка данных aJobStep As Set aJobStep "Step 1: Check = = ' Если терпит неудачу, переходим к 3-й aJobStep ' - вторая копирование базы данных.

JobStep Set New Указываем, где резервные копии bakdir & * "Step 2: Backup = DATABASE TO DISK bakdir & ' другой файл журнала, ' чтобы перезаписывать вывод 1-й ' В переходик к операции = aJobStep - Третья с помощью сценария общий файл журнала Set aJobStep = New см. след, стр.

210 Microsoft SQL Server Рис. 10. базы данных, ее and delete ' При свойству DatabaseName ' языка сценариев ' Создаем сценарий Script As = & & _ 4 & _ "* text all files and delete '" & "For = 1 To 2" & vbCrLf & - & 4 & file 1, & & text text 4 & & _ 4 vbCrlf & _ & vbCrtf & _ "Next" vbGrtf S file * & & _ & ' сценарий обратите что объекта Jo ' явно всем Nothing Script Script from & 4 "' job at 4 vbCrLf & & & _ text" 4 vbCrLf 4 _ 4 & vbCrtf & "Set fso * 4 vbCrLf _ "Set file Nothing" 4 vbCrLf * свойству объекта Script ' В любом случае выполнение = * '- задание.

Указываем которой начинается ' к "(local)" административных задач в SQL Server После создания объект Job применяется к указанному объекту SQLServer и запускается методом Invoke или Start. Эти методы делают одно и то же, но Start позволяет указать операцию, с которой начинается выполнение задания.

Последний штрих Ч подготовка одного или нескольких расписаний вы полнения задания. Для этого вы создаете объект инициали зируете его свойства и добавляете этот объект в набор со зданного объекта Job. В свойствах поля Schedule объекта JobSchedule указываются время начала и окончания действия расписания, а также пе риодичность выполнения задания (рис. Вы можете установить ежед невное, еженедельное или ежемесячное выполнение и выбрать, в какие дни недели будет выполняться задание. Заметьте, что свойства Active StartDate и объекта Schedule Ч значения типа Long в фор мате а свойства и ActiveEndTime значения типа Long формате Рис. 11. Расписание задания ' Получаем задание, которого расписание SQLJob As Set SQLJob = ';

Объект задавать ежедневное As = "Daily = - 18 октября г, в = ' Расписание прекращает ' бы не указывать дату и Day Х в объект Job.

SQLSchedule Заключение В примерах кода к статье содержится демонстрационное приложение, по зволяющее выбрать одну или несколько баз данных и либо сразу же вы полнить их резервное копирование, либо указать расписание: каждые Microsoft SQL дней, начиная с даты и времени 12). Если кноп ку (Ж, программа динамически создаст объект Job, состоящий из несколь ких операций, и инициализирует его дочерний объект в соот ветствии с параметрами, заданными пользователем. Это пример простого, но надежного UI, который по достоинству оценят большинство пользова телей.

Рис. 12. Выбор расписания резервного копирования баз данных В своей статье я лишь прошелся по верхам объектной модели тем не менее она позволяет ознакомиться с этой Большинство объектов в иерархии DMO работает весьма предсказуемым образом, так что освоить их несложно. Конечно, на это уйдет определенное время, но информация и примеры кода в моей статье помогут вам быстро добиться своих целей.

Франческо Балена (Francesco Balena) Ч главный редактор Visual Basic Journal редактор и ведущий постоянной рубрики в Visual Basic Programmer's Journal, автор книги Programming Visual Basic 6.0 (Microsoft Press, Часто на конференциях разработчиков. С ним можно связаться через сайт Дэйв Грундгейгер, Энсон Голдэйд и Вызов хранимых процедур и получение их результатов через Web* Разработчикам клиентских интерфейсов часто приходится расширять функциональность презентационного уровня в многоуровневых приложениях, но даже простое получение данных и их отображение требует внесения изменений во все уровни. Этот процесс можно упростить и сделать более гибким, используя хранимые процедуры SQL Server для автоматизации передачи данных в формате XML из данных в компоненты.

В статье представлен компонент, в котором хранимые процедуры ся с помощью XML-строк. Данные также в над ними выполняется и они предоставляются клиенту в виде HTML. Эта методика позволяет быстро вносить изменения в приложе ние, не отказываясь от его многоуровневой архитектуры. Описанный в статье подход применим в работе с SQL 7.0 или SQL Server 2000.

Как и многие другие разработчики, мы что в бизнес приложениях традиционные Windows-клиенты эволюционируют в уни версальные клиенты на основе браузера. В таких системах для доставки Web-страниц применяются Microsoft IIS (Internet Information Services) и ASP, для реализации бизнес-объектов промежуточного уровня (middle tier) Ч компоненты, написанные на Visual Basic, а для хранения данных Ч Microsoft SQL Server.

Это замечательные средства, обеспечивающие высокую гибкость, но за гибкость приходится расплачиваться. Когда пользователь требует доба * в 2001. №8 Ч Прим. изд.

214 Microsoft SQL Server вить в приложение новые разработчикам приходится тратить много времени, чтобы реализовать их поддержку на каждом уровне. Это верно даже для простых изменений вроде добавления поля адреса в окно заказа товара. При этом приходится определять новые методы (а иногда и классы) и заново компоненты.

Разработчикам клиентских интерфейсов настолько часто требуется реали зовать ввод какой-либо дополнительной информации, что мы решили най ти способ, который позволил бы ускорить внесение нужных изменений в многоуровневое приложение. В созданной нами архитектуре исполь зуется клиентской частью приложения для вызова специально написан ных нами хранимых процедур SQL Server. Результаты, возвращаемые эти ми процедурами, передаются клиенту тоже в XML-формате. Поскольку клиент может вызывать только определенные хранимые процедуры и по скольку XML перехватывается и обрабатывается на промежуточном уров не, мы сохранили все преимущества многоуровневой архитектуры и вновь получили возможность использовать средства RAD (Rapid Application Development) при работе над многоуровневой системой. И еще одно ятное преимущество. Так как данные передаются в XML-формате, ботчики клиентских интерфейсов могут легко создавать красиво ленное визуальное представление данных. В этой статье рассказывается об архитектуре, которую мы разработали, чтобы реализовать такое взаимо действие компонентов.

Исходный код и скомпилированные компоненты доступны на сайте Magazine по ссылке в раз деле за август.

Первая попытка Мы с самого начала понимали, что данные должны передаваться на пре зентационный уровень в XML-формате, так как это позволило бы нам ис пользовать XSL для преобразования XML в HTML (поддержка наиболее распространенных браузеров была для нас очень важна, равно как и воз можность изменять визуальное представление без перекомпиляции при ложения). Однако было неясно, как создавать XML-данные и передавать их на презентационный уровень. Для надежности мы хотели инкапсули ровать создание и синтаксический анализ XML. Инкапсуляция позволи ла бы скрыть детали использования XML от разработчиков, незнакомых с синтаксическим анализатором (parser) MSXML.

Мы добились этих целей, создавая оболочки для XML-схем в виде объек тов Visual Basic. Для каждого набора данных, показываемого на презента ционном уровне, определяется своя схема. Например, для поддержки окна заказа на приобретение товара мы определили соответствующую XML Вызов хранимых процедур и получение их результатов через Web схему. Как оказалось, нужную XML-схему и разработав на Visual Basic класс-шаблон, создавать классы, свойства которых соответ ствуют элементам схемы, несложно. Надо просто задать свойства объекта, а затем считать свойство объекта, чтобы получить соответствующие Объекты работали наоборот. То есть вы могли бы присвоить XML-строку свойству XML объекта, что заставило бы объект выполнить разбор XML (с помощью синтаксического анализатора MSXML) и образом настроить свои открытые свойства. Двое из нашей группы разра ботчиков, и Патрик Эскарсега (Patrick Escarcega) рас сказали об этой методологии в статье XML Wrapper Transform XML Documents into Visual Basic опубликованной в номере MSDN за январь 2001 г.

Наши усилия увенчались успехом. Мы получили унифицированный спо соб генерации XML-данных и их передачи между уровнями приложения.

Это ускорило разработку многоуровневых приложений, поскольку мы использовали простой в модификации класс-шаблон. Однако мы чувство вали, что разработчики клиентской части, реализуя отображение дополни тельной информации, по-прежнему тратили слишком много усилий. При внесении таких изменений приходилось изменять XML-схему, чтобы учесть вывод новой информации, модифицировать класс Ч оболочку схе мы и уровень хранения данных, который должен предоставлять новые Кроме того, это требовало изменений в бизнес-уровне (уровне прикладной логики) для передачи новых данных на презентационный уро вень и в самом презентационном уровне, чтобы он мог использовать эти данные. Значит, нам нужно более эффективное решение.

Решение А что если вместо определения уникальной для каждого на бора данных, поступающего на презентационный уровень, сделать так, чтобы сами данные определяли формат XML? И почему бы, вместо того чтобы поддерживать уникальные классы для каждого набора данных, не разработать универсальный код, который будет считывать данные и созда вать XML? Тогда мы смогли бы экономить по два-три дня на введении поддержки каждого нового набора данных! Именно это и было целью раз работки нашей архитектуры. Она показана на рис. 1. Вот что представля ют собой ее компоненты.

В нашей архитектуре служат лишь для создания экземпляров СОМ-объектов, выполняющих реальную работу.

Microsoft SQL Server [ Рис. 1. Архитектура доступа данным с использованием Объекты уровня Этот компонент обращается к биз нес-уровню, чтобы получить данные в XML-формате. Затем он преобразо вывает в HTML и записывает HTML в Response.

Объекты бизнес-уровня Этот компонент предоставляет объекты и мето ды, используемые презентационным уровнем. Какие объекты и методы до ступны на этом уровне, зависит от требований бизнеса;

объектам уровня не известен механизм чтения данных (об этом Ч потом).

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

Хранимые процедуры Неотъемлемая часть архитектуры. Мы не хотели, чтобы универсальный механизм доступа к базе данных опирался на XML, так как это привело бы к размытию границ между уровнями. Вместо это го он обращается только к хранимым процедурам, написанным в опреде ленном формате. То есть лишь хранимым процедурам известна структура базы данных.

В следующих разделах мы рассмотрим, как работает каждый из уровней, и вы увидите, как в нашей архитектуре обслуживаются запросы на полу чение информации. Центральное место в статье занимают разделы, где описываются адаптер доступа к данным, компонент доступа к данным и хранимые процедуры. Но сначала мы расскажем о как вызываются базовые компоненты и как используются возвращаемые значения.

Пример Web-приложения В который можно скачать к этой статье, мы включили пример Web приложения, использующего нашу технологию. Оно предоставляет про стой к базе данных поставляемой с SQL Server. Как компоненты, мы поясним позже.

После установки компонентов Web-приложение можно запустить, открыв его страницу (рис. 2). Введите Employee ID (1-9) и щелкните кнопку Log In. Появится страница Employee Detail (сведения о сотрудни Вызов хранимых и их результатов через Web ке), где показывается информация о вошедшем в систему сотруднике и заказах, за обработку которых он отвечает (рис. 3).

asp ID To Log In Through 9 are Valid) Рис. 2. Страница для входа сотрудника Edit Employee Information:

Sales New Here a of the for which you are the representative.

Order ID Customer Name Shipped Date. 05/04/ Markets Рис. З. Страница сведений о сотруднике 218 Microsoft SQL Server Страница Employee Detail создается путем запроса XML-данных от уни версального компонента доступа к данным SQL Server и вания этих XML-данных в HTML. XSL не является темой поэто му мы не будем рассматривать, как выполняется преобразование. Вместо этого поясним, как наши универсальные компоненты позволяют преобра зовывать данные SQL Server в XML и наоборот.

Выборка данных начинается, когда пользователь открывает одну из ASP системы. Мы рассмотрим процесс выборки на нескольких примерах исходного кода. Наш код реализует гипотетическое приложение, работа ющее в интрасети и позволяющее сотруднику входить в систему и офор млять заказы. Пользователь входит в систему, открывая в браузере стра ницу и вводя свой идентификатор (employee ID). После успеш ного входа происходит перенаправление на страницу Эта страница полностью основана на нашей поэтому мы детально рассмотрим ее работу.

Вот что представляет собой страница empdetail.asp:

' компонент записи и вызываем функцию ' чтобы показываемую страницу. Функция учитывает, что ' попытки входа с неправильным Set Writer = ' Уничтожаем записи Set Writer = Nothing Empdetail.asp создает экземпляр объекта презентационного уров ня (рассматривается в следующем разделе) и вызывает метод Employee Detail этого объекта. Метод EmployeeDetail генерирует HTML, показыва емый в браузере.

ASP-страницы нашего приложения-примера и функции, которые они вы полняют, показаны в табл. 1.

Табл. 1. используемые примере Страница Функции login.asp Предлагает сотруднику ввести свой идентификатор. Остальные страницы перенаправляют на эту страницу, если идентифика тор сотрудника не указан.

см. след. стр.

Вызов процедур и получение результатов через Web 1. используемые в примере (окончание) Страница Функции Вызывает метод EmployeeDetail объекта cWriter и выводит результаты в браузер методом Создается где показываются заказы, принятые данным сотруд ником.

Вызывает метод OrderDetail объекта cWriter и выводит результаты в браузер методом Создается страница, где показываются позиции по данному заказу.

Вызывает метод CreateOrder объекта cWriter и выводит результаты в браузер методом Создается страница, где показывается список Из этого списка выбирается клиент, для которого оформляется новый заказ.

additem.asp Вызывает метод объекта cWriter и выводит результаты в браузер методом Создается страница, где показывается список товаров, добавляемых в заказ.

Объекты презентационного уровня Презентационный уровень реализован в проекте COMASP.vbp на Visual Basic. Этот проект компилируется в Он содержит единственный класс, cWriter, несколько методов которого вызываются Мы стремились к тому, чтобы в ASP-страницах было как можно меньше кода. Наш компонент поддерживает ссылку на контекст ASP-сценариев (ASP scripting context), который в свою очередь предоставляет компонен ту доступ к Application, Request, Response, Server и Session.

Имея доступ к этим компонент может делать то же, что и ASP сценарий (и даже больше, так как используется Visual Basic, а не Ссылку на контекст ASP-сценариев возвращает метод OnStartPage наше го класса. Когда ASP-страница создает экземпляр объекта, IIS автомати чески вызывает этот метод объекта и передает ему ссылку на контекст сце нариев. Затем метод OnStartPage сохраняет эту ссылку для дальнейшего использования другими методами класса. Обратите внимание, что для ра боты с контекстом сценариев в проекте на Visual Basic должна быть ссыл ка на Microsoft Active Server Pages Object (asp.dll).

Методы, предоставляемые классом cWriter, показаны в табл. 2. Рассмот рим метод EmployeeDetail, вызываемый VBScript-сценарием, который за пускается страницей empdetail.asp. Этот метод создает экземпляр объекта бизнес-уровня MiddleTier.cEmployees и вызывает метод GetDetail этого объекта, чтобы получить информацию о сотруднике, идентификатор кото рого указывается при вызове. Значение, возвращаемое GetDetail, Ч стро ка в XML-формате. Ниже показан код.

Server Set = = Табл. 2. Методы cWriter Метод Вызывается: Описание Страницей Определяет, что выбрал пользователь additem.asp (добавить позицию в заказ, изменить позицию или ввод заказа), и выполняет соответствующее действие.

Страницей ли клиента, для которого создается заказ.

Если да, в базе данных создается запись заказа, и направляется на страницу orderdetail.asp.

EmployeeDetail Страницей Создает список заказов, которые принял сотрудник, вошедший в систему. Иденти фикаторы заказов показываются как гиперссылки на страницы с информацией о позициях заказа.

Страницей Проверяет, есть ли в базе данных фикатор сотрудника, указанный при входе, а затем направляет пользователя на страницу со сведениями о сотруднике (empdetail.asp).

Когда на ASP- Используется, чтобы получить ссылку загружа- на текущий контекст сценариев.

емой IIS, создается экземпляр класса Страницей Выводит сведения о сотруднике и заказ чике, а также список товаров, включенных в заказ.

Затем XML загружается в DOM-объект для преобразования в соответствии с определенным в файле empdetail.xsl. Вот код вызова этого преобразования, также содержащийся в методе EmployeeDetail:

Set = New Set = New & EmployeeDetail = Результат строка в HTML-формате, которая является возвращаемым значением функции EmployeeDetail и в конечном итоге показывается в браузере.

Вызов процедур и их результатов через Web Объекты Объекты бизнес-уровня реализованы в проекте ном на Visual Basic и скомпилированном в В этом проекте два класса: cEmployees и cOrders (считывающие сведения о сотрудниках и за казах соответственно). В предыдущем разделе мы показали, как презента ционный уровень вызывает метод GetDetail класса cEmployees, чтобы по лучить информацию о вошедшем в систему сотруднике. Рассмотрим этот метод, чтобы понять, что происходит, когда презентационный уровень вызывает этот метод.

Метод GetDetail создает экземпляр объекта cAdapter компонента Data AccessAdapter (о нем Ч в следующем разделе), инициализирует свойства объекта и вызывает его метод CallSP;

Set = New with oAdapter = = End Инициализируя свойства, вызывающий код сообщает адаптеру доступа к данным, какая хранимая процедура вызывается и какие значения прини мают параметры. Возвращаемое методом CallSP значение Ч XML-строка, в которой закодированы получаемые от хранимой процедуры, О том, как кодирование, мы расскажем чуть позже. Полу ченный при необходимости можно обработать на бизнес-уровне, но в нашем примере просто возвращается на презентационный уровень для преобразования в HTML.

Адаптер доступа к данным Адаптер доступа к данным Ч один из двух универсальных компонентов, используемых в примере (о втором мы расскажем в следующем разделе).

Эти два компонента позволяют вызывать специализированные хранимые процедуры и получать их результаты в виде XML. Адаптер доступа к дан ным реализован в проекте DataAccessAdapter.vbp, написанном на Visual Basic и скомпилированном в spdaad.dll. В проекте четыре класса: cAdapter, cParameter, cParameters и cAdapter Основной класс компонента и единственный, чей экземпляр могут создавать внешние объекты. Чтобы воспользоваться адаптером, вы зывающий код создает экземпляр этого класса, инициализирует его свой ства и вызывает метод CallSP. Свойствами класса cAdapter являются SPName и Parameters.

222 Microsoft SQL Server Свойство указывает вызываемую хранимую процедуру базы дан ных. Его значение должно соответствовать имени существующей храни мой процедуры, написанной в подходящем формате. Важно заметить, что универсального механизма вызова хранимых процедур нет. Попытка вы зова хранимой имеющей неправильный формат, приводит к ошибке.

Присвоение значения свойству дает побочный эффект;

у базы данных запрашивается (через компонент доступа к данным) список пара метров, используемых этой хранимой процедурой. Их список заносится в набор Parameters объекта cAdapter, что удобно для вызывающего кода.

Parameters (только для чтения) содержит ссылку на объект cParameters. Через это свойство вызывающий код задает значения пара метров.

В классе cAdapter определен лишь один метод, CallSP:

Public Function As As String Эта функция принимает один параметр Ч типа ReturnData Enum. Его значение какие результаты вызывающий код ожида ет получить от хранимой процедуры. Перечислимое ReturnDataEnum оп ределяется так:

Public ReturnDataEnum == О = End Enum Значение daParameters что хранимая процедура возвращает данные в одном или нескольких выходных параметрах, daRecords Ч что хранимая процедура возвращает данные в наборах результатов.

что задавать эту должен вызывающий код.

cParameter Этот класс представляет параметр, передаваемый хранимой процедуре. Вызывающий код получает ссылку на объект cParameter через набор Parameters объекта cAdapter. Имя параметра используется в Parame ters как ключевое значение. Так, следующая строка кода присваивает зна чение параметру Value = Если вызывающий код указывает имя параметра, который не поддержива ется хранимой процедурой, заданной в свойстве объекта cAdapter, генерируется ошибка.

cParameters Этот класс является набором объектов cParameter.

процедур и получение их результатов через Web Этот класс Ч не более чем определение интерфейса. Мы опре делили интерфейс lExpose для поддержки отладки и тестирования. Он ре ализуется классом cAdapter.

Метод CallSP класса cAdapter упаковывает имя и параметры хранимой процедуры в XML-строку и передает эту строку компоненту доступа к данным. Тот распаковывает имя и параметры хранимой процедуры и вы зывает хранимую процедуру через ADO. Затем получает возвращаемые процедурой данные, упаковывает их в XML и передает адаптеру доступа к данным. Мы пошли таким путем, поскольку хотели, чтобы компонент доступа к данным был полностью ориентирован на использование XML, Таким образом, при вызове хранимой процедуры передается и ре зультаты тоже возвращаются в XML-формате. Адаптер доступа к данным предназначен для того, чтобы вызывающий код мог обращаться к функци ям компонента доступа к данным, ничего не зная об XML.

Для большей наглядности в статье мы приводим упрощенную версию кри тически важного кода CallSP. (Реальный код отслеживает промежуточную информацию, предоставляя доступ к ней через интерфейс lExpose.) Следующие значения уже заданы:

strSPName хранимой процедуры), набор объекта cAdapter), ReturnType (значение перечислимого типа Set = New Set = New = = ReturnType) Здесь метод CallSP вызывает метод ParameterXML набора cParameters, чтобы заключить параметры (и имя хранимой процедуры) в XML-строку должного формата. (О ее формате мы расскажем потом.) После этого XML-строка передается методу GetDataXML класса компонен та доступа к данным.

Компонент доступа к данным Компонент доступа к данным Ч рабочая лошадка системы. Он принимает запросы в XML-формате, разбирает их, получая имя и параметры храни мой процедуры, вызывает хранимую процедуру и возвращает результаты в XML-формате. Этот компонент реализован в проекте написанном на Visual Basic и скомпилированном в spda.dll. В проекте один класс, cAccessor, в котором доступно два метода: GetDataXML и Parame terXML.

224 Microsoft Server GetDataXML При вызове этого метода хранимая и принимаются возвращаемые результаты. Метод GetDataXML имеет сле дующий синтаксис:

Public Function SPXMLState As _ As As String SPXMLState Ч это XML-строка, задающая, какая хранимая процедура вызывается и какие значения принимают ее параметры (если таковые есть). Формат XML-строки поясняется в разделе XML-описание вызова хранимых процедур. Значение ReturnType задает, какой тип результатов ожидает от хранимой процедуры вызывающий код. Перечислимое Return TypeEnum определяется так:

Public ReturnTypeEnum О End Enum Значение daParameters указывает, что хранимая процедура возвращает данные в одном или нескольких выходных параметрах. Значение daRe cords указывает, что хранимая процедура возвращает данные как набор результатов. Обратите внимание, что это перечислимое в точности соот ветствует перечислимому используемому адаптером доступа к данным.

Значение, возвращаемое GetDataXML, Ч это XML-строка, содержащая результаты хранимой процедуры. О формате этой XML-строки мы расска жем в дальнейшем.

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

Public Function As String) _ As String Единственный параметр, StoredProcedureName, указывает имя хранимой процедуры. Возвращаемое значение Ч XML-строка, содержащая XML представление хранимой процедуры, в том числе имена параметров, их типы и направление. Формат этой XML-строки описывается далее.

Хранимые процедуры Чтобы весь этот механизм работал, в нашей базе данных должны быть хра нимые процедуры, имеющие строго определенный формат. При разработке этого формата мы стремились к гибкости в задании типа и объема возвра щаемых Кроме того, мы учитывали, что единственным модулем, хранимых процедур я получение их результатов Web напрямую вызывающим наши хранимые процедуры, является компонент доступа к данным, который формирует по возвращаемым данным.

Поэтому мы разработали схему, поддерживающую возврат результатов хранимой процедуры в XML-формате.

Чтобы получить данные, необходимые для формирования исполь зуется способность хранимой процедуры возвращать несколько наборов результатов. Если вы еще не знаете, что ADO способна возвращать не сколько наборов результатов за один вызов, примите к сведению: это от личный способ сократить число обращений к базе данных при получении данных, связанных между собой, но не принадлежащих одному набору результатов. Так, Web-страница, показывающая заказы, принятые сотруд ником, содержит заголовок со сведениями о сотруднике и записи с инфор мацией о заказах. Вместо двух обращений к базе данных для получения этих двух наборов данных, можно один раз вызвать хранимую процедуру, которая возвращает сразу два набора результатов.

Хранимая процедура, которая с помощью операторов SELECT возвраща ет пять наборов результатов, показана на рис. 4. Код, который вызывает эту хранимую процедуру и перебирает наборы результатов, мог бы выгля деть так:

' что где-то выше есть операторы Dim и Set для ' Получаем первый набор результатов Set = Do While Not Is Nothing) Делаем что-то с ' Получаем следующий набор Set rs = Loop Все делается так же, как и при использовании одного набора результатов, Ч просто добавляются цикл While и вызов Первый набор результатов задает имя создаваемого набора XML-данных.

Компонент доступа к данным присваивает это имя самому внешнему элементу возвращаемого За этим набором результатов следует одна или несколько пар наборов результатов. Первый набор ре зультатов каждой пары содержит два имени XML-эле ментов, используемых для указания имен, а второй Ч собственно возвра щаемые данные. Рассмотрим, например, хранимую процедуру 226 SQL Server показанную на рис. 4. Компонент доступа к данным бирает эти наборы результатов в цикле (как показывалось в предыдущем фрагменте кода) и генерирует (рис. 5). (Для краткости на рисунке приведено лишь два элемента В реальных данных элементов раздо Как уже упоминалось, хранимая процедура на рис. 4 возвращает пять на боров данных Ч по одному для каждого оператора SELECT. Рассмотрим каждый из этих операторов.

Первый набор результатов генерируется оператором SELECT:

SELECT AS DataSet Рис. 4. Хранимая процедура AS INT AS набора данных, которое Ч и используется в документа SELECT AS Указываем о сотруднике SELECT AS AS образующие часть DOM с информацией о сотруднике, WHERE = -- Указываем SELECT "Orders" AS "Order" AS Ч Возвращаем записи заказов SELECT 101} AS 101) AS Total = (1 - * AS AS Orders ord JOIN Customers ON JOIN [Order det ON GROUP BY ord.OrderlD, cu BY DESC процедур и получение результатов Web 22?

5. Результаты хранимой ;

dt= dt:

Canyon Он создает набор записей, одну запись с одним полем Data Set. Значением этого поля является Первый набор резуль татов всегда должен содержать одну запись с одним полем DataSet. Ком понент доступа к данным использует значение этого поля для задания имени самого внешнего элемента возвращаемого (рис. 5).

Затем идет пара наборов результатов, создаваемых следующими двумя операторами SELECT:

SELECT "Employees" AS "Employee" AS RecordType SELECT LastName, Title, FROM Employees EmployeelD = Первый набор результатов задает имена, используемые в Этот набор результатов содержит одну запись с двумя полями: NextResultSet и Re cordType. Значение поля NextResultSet (в данном случае Employees) указывает имя набор XML-данных, а значе ние (в данном случае Ч имя XML-элемента, со держащего отдельную запись. Второй набор результатов Ч сами данные.

Здесь считывается одна запись таблицы Employee, описывающая сотруд ника с идентификатором, переданным хранимой процедуре. На рис. 5 вид но, как имена полей возвращаемого набора результатов на элементы возвращаемого компоненту доступа к данным.

посмотрим на рис. 5 результаты двух последних операторов SELECT хранимой процедуры, показанной на рис. 4. В этом случае пер вый набор результатов также задает имена, используемые для данных, воз вращаемых компонентом Второй набор содержит собственно дан ные Ч список заказов, принятых сотрудником, Возврат данных через выходные параметры Кроме возврата данных в наборах результатов, наша инфраструктура под держивает возврат данных и в выходных параметрах (либо один либо второй, а не и то и другое одновременно). Ниже показана хранимая процедура, значение в выходном параметре.

AS INT, AS INT NULL OUTPUT AS :

Ч Получаем идентификатор сотрудника для данного SELECT = FROM Orders WHERE = Хранимая процедура принимает идентификатор заказа и возвращает в выходном параметре идентификатор сотрудника. Метод класса cOrder в промежуточном уровне приложения вызывает эту проце дуру через адаптер доступа к данным:

Set = New With oAdapter = =.CallSP = Value End With Как видите, после вызова CallSP объекта cAdapter хранимой процедурой значение EmployeelD берется из набора параметров этого объекта.

процедур и их через Web Хранимая может вообще не возвращать данные (ни в выходных параметрах, ни в возвращаемом значении). Так, на рис. 6 показана храни мая процедура, создающая запись заказа. Эта процедура возвращает иден тификатор созданной записи. В класс cOrders промежуточного уровня входит метод содержащий код:

Set oAdapter New With oAdapter = = =.CallSP = End With Хранимая создающая заказ CREATE AS INT, AS AS Ч с идентификатором записи о DECLARE AS INT запись и INSERT Orders VALUES Ч только что идентификатор SET Обновляем заносим в нее данные об -- которые берутся из записи UPDATE SET = = = Customers WHERE = -- созданной Как показано в этом коде, наша инфраструктура добавляет элемент RET в набор Parameters объекта cAdapter. Этот элемент содержит значение, хранимой процедурой (если она возвращает ка кое-либо значение).

230 Microsoft SQL Server XML-описание вызова хранимых процедур Хранимые процедуры можно вызывать, напрямую передавая XML-строки компоненту доступа к данным. этого создается экземпляр объекта cAccessor и вызывается его метод Синтаксис метода Get описывается в разделе Компонент доступа к данным.

как параметр метода GetDataXML и содер жит информацию о том, какая хранимая процедура и какие параметры в нее передаются. Ниже показан пример XML, описывающего пашу хранимую процедуру (рис. 4).

Внешним элементом должен быть . Атрибут SPName этого эле мента задает имя вызываемой хранимой процедуры. Если у хранимой цедуры параметры или значение, они передаются как дочерние элементы элемента . В случае параметров именем до чернего элемента является имя параметра, а в случае зна чения Ч Атрибут Direction указывает направление па раметра. Значение этого атрибута передается ADO при вызове хранимой процедуры. Направление определяется одним из значений перечислимо го определенного в ADO:

Public = О = = = End Атрибут Datatype о передаче типа данных. Его значе ния берутся из перечислимого DataTypeEnum, объявленного в ADO. В показанном выше XML возвращаемое значение и параметр тип данных (3 -- это значение константы опре деленное в ADO). Полный список констант, входящих в это перечислимое, слишком длинный, чтобы приводить его в статье;

более подробную инфор мацию о DataTypeEnum см. в MSDN Online Library.

Тестирование хранимых процедур Мы написали тестовое приложение, позволяющее экспериментировать с компонентами доступа к данным и хранимыми процедурами, Вызов хранимых и их результатов через Web эти компоненты. На наш это крайне полезно, когда нужно проверить корректность хранимой процедуры или визуали зировать возвращаемый компонентом при данной хранимой процедуры. Кроме того, мы добавили в компонент доступа к данным спе циальный интерфейс, используемый только тестовым приложением. Этот позволяет детальнее изучать с которым имеет дело тес тируемый компонент.

Чтобы запустить тестовое приложение, запустите файл spdatest.exe. Вне шний вид тестового приложения показан на рис. 7. Оно жестко запрог раммировано на использование источника данных Что бы получить список хранимых процедур, предоставляемых этим источни ком данных, щелкните стрелку, указывающую вниз, в поле со списком Stored Procedure Name. Тестовое выполняет запрос к источ нику данных и показывает имена хранимых процедур в раскрывающемся списке. Заметьте, что перечисляются все хранимые процедуры базы дан а не только поддерживающие архитектуру. Поэтому будьте ос торожны и выбирайте только те хранимые процедуры, о которых извест но, что они удовлетворяют требованиям нашей архитектуры. К таким про цедурам относятся:

Х Customer XML til* "Lift The for 3 each required parameter a Рис. 7. приложение Microsoft SQL Server Х Х Х Х Order_GetDetail;

Х Order_Updat:eOrder;

Х Х Valid Employee.

Рассмотрим тестовое приложение на примере хранимой процедуры Emp После выбора или ввода хранимой процедуры в поле со списком щелкните кнопку List Parameters, чтобы получить список параметров нимой процедуры. Тестовое приложение запрашивает эту информацию у источника данных (см, дополнительную информацию на врезке Про граммное определение хранимой запроса показываются в левой части окна тестового приложения (рис. 8).

Рис. 8. Возвращаемый XML На рис. 7 видно, что хранимая процедура возвраща ет значение и принимает один входной параметр D. Перед ее процедур и получение их результатов Web вызовом вы должны присвоить значение этому параметру. Для этого щелкните имя параметра, введите требуемое значение и щелкните кнопку Update. Затем щелкните кнопку Call Stored Procedure для вызова хранимой процедуры. Тестовое приложение по введенным вами данным создаст XML-строку и передаст ее методу компонента дос тупа к данным. Компонент проанализирует строку, вызовет соответствую щую хранимую процедуру и сформирует возвращаемую XML-строку, в которой будут закодированы результаты. Эта XML-строка показывается тестовым приложением (рис. 8).

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

Х На вкладке Parameter List XML отображаются внутренние XML-дан ные, которые компонент доступа к данным передает адаптеру доступа к данным после задания имени хранимой процедуры. Эти данные держат описание параметров хранимой процедуры и используются адаптером при заполнении набора cParameters. Parameter List XML становится доступной после щелчка кнопки List Parameters.) Х На вкладке Call SP XML выводятся внутренние XML-данные, переда ваемые адаптером доступа к данным компоненту доступа к данным при вызове хранимой процедуры SQL Server. Это XML-сообщение содержит значения параметров, передаваемые вызываемой хранимой процедуре.

Х На вкладке Raw XML отображаются XML-данные, возвращаемые компонентом доступа к данным адаптеру после выполнения хранимой процедуры. В этих необработанных XML-данных содержатся либо дан ные набора записей, либо хранимой процедуры.

На вкладке Return XML показывается окончательный набор XML данных, возвращаемый коду, вызвавшему адаптер. Эти XML-данные являются возвращаемым значением метода CallSP класса cAdapter. Тэг означает, что набор записей не запрашивался, Ч это типично для хранимых процедур, обновляющих базу данных.

Программное определение параметров хранимой процедуры Один из способов передачи параметров хранимой процедуре вручную сформировать набор ADO-параметров. Пишется код примерно такого вида:

' что уже объявлена оператором Dim ' как и ей присвоено значение ' оператором Set. Также что уже объявлена 234 SQL Server ' Dim как Set = adParamlnput) Set = _ AdParamlnput, 40) если вы работаете с данных SQL Server 7.0, то можете ини циализировать объект и метод Refresh его набора Para meters, Тогда в набор Parameters загрузятся описания параметров из базы данных. После этого вы можете обращаться к параметрам, используя име на параметров в качестве индексов. При таком подходе пишется пример но такой код:

' Предполагается, что cmd уже оператором Dim ' как и ей соответствующее значение ' оператором Set With cmd With = = "Some Text" End With With Второй подход дает ряд преимуществ. если кто-то решит изме нить имя параметра в базе данных, вы сможете точно узнать, какой пара метр изменился, так как при попытке обращения к этому параметру воз никнет ошибка. При первого способа ошибки не будет, пока не выполните команду. Кроме второй подход позволяет пе ребирать объекты Parameter, запрашивать их свойства и в со ответствии с полученными значениями свойств. Мы применили этот под ход при формировании XML-представления параметров, передаваемого адаптеру доступа к данным.

Развертывание компонентов Развертывание лучше в указанном нами порядке. Все ссылки на имена папок даются по отношению к корневому каталогу примеров кода (каталогу, где вы сохранили этот код).

Для развертывания хранимых процедур SQL Server выполните следую щие действия, 1. Запустите SQL Query Analyzer и войдите на сервер, на котором вы создать хранимые (Это должен быть SQL Server с де базой данных поставляемой с SQL Server.) Вызов хранимых процедур и получение их через Web 2. В поле со списком смените имя базы данных на Northwind.

3. Откройте файл находящийся в папке Database.

4. Щелкните кнопку запуска на панели инструментов или нажмите кла вишу чтобы выполнить в базе данных сценарий, создающий храни мые процедуры.

Заметьте: сценарий изменит имя базы данных на Northwind, но перед вы полнением сценария всегда лучше заранее перейти на нужную базу дан ных. Сценарий удалит существующие процедуры, имена кото рых совпадают с именами Мы полагаем, что это не вызовет проблем, поскольку не так уж много людей создает хранимые процедуры в базе данных Northwind. если вы пишете хранимые процедуры, размещаемые в этой базе данных, то, чтобы не потерять результаты труда, убедитесь, что у вас нет процедур с совпадающими Развертывание компонента доступа к данным Компонент доступа к данным (spda.dll) использует в код DSN имя при открытии ADO-объекта Connection, с сервером баз данных. Вам придется создать DSN на компьютере, будет работать компонент доступа к данным. Используйте аутентифика цию Integrated Security* и выберите Northwind в качестве базы данных по умолчанию.

Если вы не очень хорошо знакомы с созданием см. SQL Server Books Online.

Развертывание в средах с поддержкой СОМ+ и без такой поддержки Скомпилированный компонент в составе скачиваемого к этой статье кода предназначен для развертывания в среде, не поддерживающей Однако он написан так, что для развертывания компонента в среде требуется лишь перекомпилировать проект, изменив аргумент условной компиляции и раскомментировав кое-какой код. Чуть позже мы расска жем о развертывании компонента в среде А если вы не собираетесь использовать компонент в среде выполните следующие действия.

1. Перейдите в папку DataAccess.

2. Зарегистрируйте находящийся в ней файл spda.dll с помощью Reg Более подробную информацию о регистрации СОМ-компо нентов и DLL см. в Registering COM Applications по ссылке msdn.microsoft.com/ Видимо, имеется в виду аутентификация Windows NT. Ч 236 SQL Чтобы развернуть DLL к данным в среде сделайте вот что.

1. Откройте в Visual Basic проект DataAccess.vbp.

2. Откройте класс cAccessor и раскомментируйте строку кода, содержа щую текст и что в проекте есть ссылка на Services Type Library.

3. Откройте Project Properties, перейдите на вкладку Make и измените аргумент условной компиляции с = 0 на pile_MTS = 4. Перекомпилируйте проект и поместите полученную DLL пакет Заметьте: вы должны экспортировать пакет, содержащий эту DLL, в пакет MSI Installer, чтобы другие клиентские могли получить ссыл ку на данный пакет. Подробную информацию об пакетов см. в Platform SDK (раздел Component Services Кроме того, вы можете запускать этот компонент в среде Microsoft Tran saction Server (MTS) в Windows NT 4.0. Для этого установите ссылку на object control и оператор Implements так, чтобы он указывал на библиотеку MTS вместо библиотеки сервисов СОМ+.

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

Перейдите в папку 2. Зарегистрируйте библиотеку spdaad.dll, находящуюся в этой папке, с помощью RegSvr32.exe. Если DLL развертывается не на компьютере, где находится компонент доступа к данным, вам придется взаимодей ствовать с DLL, обеспечивающей доступ к данным, через DCOM. Если DLL доступа к данным установлена в среде СОМ+, то, чтобы к этой DLL можно было обращаться, ее нужно экспортировать в пакет MSI Installer и запустить пакет на клиентском компьютере.

Развертывание компонентов промежуточного и презентационного уровней На промежуточном уровне в нашем проекте находятся бизнес-сервисы.

Для развертывания действия.

1. Перейдите в папку MiddleTier.

2. Зарегистрируйте spdamid.dll, находящуюся в этой папке, с помощью RegSvr32.exe.

Вызов хранимых и получение их через Web 23?

На компьютере, где выполняется Web-сервер, нужно развернуть компо нент презентационного уровня Обратите внимание, что папку XSL и все содержимое следует поместить в ту же папку, в которой развернута и зарегистрирована COMASP DLL.

1. Перейдите в папку COMASP.

2. Зарегистрируйте файл spdaui.dll, находящийся в этой папке, с помо щью Развертывание ASP-страниц Для развертывания ASP-страниц выполните следующее.

1. Скопируйте папку ASP вместе со всем содержимым в папку, из кото рой IIS загружает ASP-страницы. Если хотите, можете не папку. Просто сделайте так, чтобы виртуальный каталог (создаваемый на следующем указывал на папку ASP.

2. Создайте на новый виртуальный каталог, из которого бу дут загружаться ASP-страницы. Настройте этот виртуальный каталог Х так, чтобы он указывал на папку ASP.

3. Откройте диалоговое окно Properties что созданного виртуаль ного каталога и выберите вкладку Directory Security. Щелкните кноп ку Edit в секции Anonymous Access and Control. В по явившемся диалоговом окне щелкните кнопку Edit в секции Anony mous Access Frame. Выберите себя или какого-то другого у которого есть на запуск хранимых процедур базы данных Введите пароль и сбросьте флажок Allow IIS to Control Password. Щелкните OK во всех диалоговых окнах, чтобы сохранить изменения. Эта операция обязательна, так как IIS по умолчанию ис пользует удостоверения защиты Anonymous. Поскольку этот пользователь обычно не имеет разрешения на выполнение храни мых процедур базы данных, мы просто указываем, что вместо учетной записи анонимного пользователя IIS должен использовать учетную запись того, у кого такое разрешение есть.

Развертывание тестового приложения Запустите тестовое приложение (spdatest.exe) на компьютере, где установ лен адаптер доступа к данным.

При разработке решения, о котором мы рассказывали в статье, использо вался редактор XMLwriter ( Список доступных можно посмотреть на сайте XML.com издательства O'Reilly Учтите, что некоторые ре дакторы предназначены специально для преобразований XML в HTML, Microsoft SQL Server но не очень хорошо справляются с преобразованиями XML-XML. Вы бирайте редактор, отвечающий вашим потребностям, Заключение Разработанная нами методология оказалась вполне удачной. На написа ние универсальных компонентов потребовалось около недели. После это го передача информации между клиентской частью и базой данных пре вратилась в обмен соответствующими XML-данными. Это упростило пе редачу информации между компьютерами, так как все данные передаются по значению, а не по ссылке на объект. Представление данных в XML формате облегчило разработку клиентского интерфейса: чтобы изменить представление данных на экране, нужно лишь изменить применяемое к XML.

Дэйв Грундгейгер (Dave Grundgeiger) Ч консультант в Software Inc.

( в Мэдисоне (штат Висконсин), где он и живет, погруженный в технологии Microsoft. Автор книги & MAPI Programming with Visual Basic (O'Reilly, 2000). Работает над книгой по Visual Basic которая выйдет в издательстве O'Reilly.

Энсон Голдэйд Goldade) Ч консультант. Сейчас вовсю осваивает С#.

Вэрон (Varon Fugman) Ч консультант в Beacon Inc. в Мэдисоне (штат Висконсин). Как и его коллеги, Дэйв и специализиру на многоуровневых бизнес-решениях для вертикальных рынков, разрабатываемых с применением Visual Basic, IIS, и SQL Server.

Марк Браун и Дэвид Компактные и надежные приложения на основе SQL Server CE 2.0 и Compact Framework* Разработчикам мобильных приложений предлагается целое море возможнос тей. Однако создать компактное и в то же время надежное локальное хранилище данных очень нелегко. Эту проблему обещает снять SQL Server CE 2.0. С точки зрения функциональности и новая версия SQL Server CE Ч настоящий прорыв по сравнению со своей предшественни цей. Авторы рассматривают некоторые из современных платформ и ментов и сравнивают возможности SQL Server CE версии 2.0 с предыдущей, особо выделяя наиболее важную новую функциональность. Статья заверша ется созданием приложения-примера.

развитие мобильных устройств в последние годы вызвало к жизни новое поколение мобильных приложений, предназначенных как для потребителей, так и для организаций. Эта тенденция не осталась не замеченной Microsoft, создавшей целый ряд инструментов и инфраструк тур, позволяющих разработчикам в полной мере использовать возможно сти интеллектуальных устройств. Новые наборы вку пе с широкими возможностями этих устройств подготовили почву для создания самых передовых мобильных приложений.

Microsoft SQL 2000 Windows CE Edition (также известный как SQL Server СЕ 2.0) является дальнейшим развитием версии Microsoft SQL Server, Публиковалось Б Magazine/Русская 2003. №1 Ч Прим.

240 Microsoft SQL Server предназначенной для устройств под управлением Windows CE. SQL Server СЕ 2.0 предоставляет всю важнейшую функциональность для отказоустойчивых приложений, работающих с базами данных в среде Windows СЕ или Windows CE данных, оптимизирующий процессор запросов, поддержку различных видов подключений и т. д. Но вая редакция этой СУБД совместима с SQL Server 2000. Невероятно, но несмотря на все эти возможности SQL Server CE 2.0 занимает но малый объем памяти.

В новой версии появился ряд важных функций и заметно повышена про изводительность по сравнению с предшествующей версией. Если вы уже работали с SQL Server CE, то непременно заметите, что новая версия ботает быстрее, а ее модель программирования расширена для поддержки Compact Framework.

Мы познакомим вас с некоторыми из ключевых функций, появившихся в новой версии SQL Server CE, и рассмотрим ряд фрагментов кода, иллюс эти функции. Однако всестороннее освещение SQL Server CE не является задачей нашей Ч она лишь должна подтолкнуть вете ранов и новичков разработки для мобильных устройств к созданию мо бильных приложений на новой редакции SQL Server CE.

Разработка мобильных решений Длинный список инструментов разработки и инфра структур угнетающе действует на новичков в создании мобильных прило жений. SQL Server CE 2.0 Ч один из инструментов в арсенале раз работчика ПО для мобильных устройств, Очень трудно, если вообще воз можно, порекомендовать единственно верную комбинацию инструментов и устройств, идеально подходящую для создания некоего мобильного ре но есть ряд факторов, которые следует обязательно учитывать.

Современные разработчики могут ориентироваться на различные типы устройств, работающих под управлением Windows CE. Достаточно давно известны такие платформы, как Pocket PC (РРС) и Handheld PC (HPC).

Большинство из них оснащается модулями для беспроводной связи по протоколам Bluetooth или что делает эти устройства весьма фун кциональными и способными обеспечить постоянное сетевое соединение.

Устройства под управлением Windows CE обычно рассчитаны на ко нечных потребителей. Но в организациях начинают понимать, что подоб ные устройства существенно повышают производительность труда не только их клиентов, но и сотрудников.

Совсем недавно стали встраивать технологии беспроводно го доступа в сами устройства. Прошли те когда приходилось че Компактные и иа SQL Server CE 2.0 рез громоздкие адаптеры PC Card подключать платы беспроводной связи.

Также наблюдается тенденция к объединению сотовых телефонов с уст ройствами Pocket PC, в результате чего на свет появляются весьма инте ресные гибриды.

Встраиваемые устройства с Windows СЕ проникают и в заводские цеха.

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

Любопытно, что большинство встраиваемых оснащаются более новыми версиями Windows СЕ, чем устройства, ориентированные на конечного потребителя. Новейшие OEM-устройства уже работают под Windows СЕ Кроме того, на этих устройствах Compact Framework имеется по умолчанию, что делает такую платформу привлекательной для разработчиков, специализирующихся на создании корпоративного ПО и желающих использовать все преимущества предла гаемых Microsoft инструментов и инфраструктур следующего поколения, Windows СЕ также комбинируется с самыми разнообразными ми технологиями, в том числе с устройствами для считывания карт памя ти Compact Flash (CF), сканерами штрих-кодов и отпечатков пальцев, приемниками Global Positioning System (GPS), а также с цифровыми ка мерами. Некоторые из типичных мобильных решений, создаваемых с по мощью современных инструментов и устройств на основе Windows СЕ, перечислены в табл. 1. Очевидно, что эти мобильные приложения требу ют компактного и в то же время надежного решения для создания локаль ного хранилища данных.

Табл. 1. Примеры мобильных приложений Сфера применения Предназначение отдела Обеспечение доступа вне офиса к спецификациям продаж Force товаров и информации о клиентах Automation, SFA) Грузоперевозки Регистрация времени, адреса доставки и объема груза, (логистика) а также подписание о доставке Недвижимость Службы Multiple System (MLS) Медицина Ведение карт пациентов (выявленные аллергены, результаты исследований, текущие назначения) Консалтинг Учет затрат времени, расходов и выписка счетов и планирование ресурсов Главная проблема, стоящая перед разработчиками, Ч сравнительно малый объем памяти у мобильных устройств (как правило, 16-32 Мб). С ростом 242 Microsoft SQL Server объема памяти мобильных устройств возрастет и сложность мобильных приложений. Естественно, механизм локального хранилища данных не должен занимать много памяти. Кроме того, вашему приложению навер няка понадобится выполнение сложных запросов к локальному хранили щу данных.

Такие приложения должны одинаково хорошо работать как в подключен ном, так и в автономном режимах. Эти требования обуславливают необхо димость в API-функциях для локального и удаленного доступа к данным, равно как и в механизме синхронизации с серверной базой данных. К сча стью, предоставляемая SQL Server CE 2.0 инфраструктура позволяет со здавать приложения, удовлетворяющие всем этим требованиям.

В автономном режиме SQL Server СЕ обеспечивает хранилище данных на локальном устройстве. Она позволяет надежно отслеживать все ния в базе данных на устройстве и после восстановления подключения синхронизировать их с серверной базой данных. То же верно и в отноше нии изменений на серверной стороне. SQL Server СЕ поддерживает Merge Replication (репликация со слиянием) для двусторонней син хронизации изменений во всех базах данных (при использовании в соче тании с SQL Server 2000).

Инструменты для разработки мобильных приложений SQL Server CE 2.0 позволяет разработчикам использовать как текущие инструменты, так и инструменты следующего поколения. Для тех, кто предпочитает создавать мобильные приложения с помощью Tools 3.0, в SQL Server CE 2.0 сохранена поддержка этого инстру ментального набора, Так что вы можете по-прежнему писать мобильные приложения как на eMbedded Visual Basic, так и на eMbedded Visual C++.

И если ваш выбор Ч eMbedded Visual Tools, знайте, что SQL Server CE 2. требует наличия на устройстве Windows CE версии 3.x или выше.

Инструменты и инфраструктуры следующего поколения от Microsoft под держивают технологию быстрой разработки мобильных приложений. Пе реход к разработке на платформе Windows позволит мобильным приложениям использовать многие доступные настольным системам. Исходный код написанный на eMbedded Visual Basic или Visual C++, можно перевести на использование Visual Basic и ADO.NET.

Сравнительно недавно Microsoft представила технологию Smart Device Extensions позволяющую использовать при разработке мобильных и настольных приложений набор инструментов Visual Компактные и надежные приложения на SQL Server CE 2.0 Studio За счет бесшовной интеграции Visual Studio и SDE об разуют платформу для разработки приложений Windows СЕ.

В следующую версию Visual Studio (под кодовым названием Eve будет встроена поддержка Compact Framework, Pocket PC и устройств с Windows CE Языковые средства SQL Server CE 2. В SQL Server CE 2.0 есть свой провайдер OLE DB. В отличие от аналогично го провайдера из SQL Server 2000 он предоставляет всего одно свойство Ч для задания полного пути к файлу от крываемой базы данных. Например, чтобы открыть файл надо передать при вызове IDBProperties::SetProperties строку через DBPROP_INIT_DATASOURCE.

Кроме SQL Server CE поддерживает механизм управления доступом на уровне файлов Ч пароли баз данных. При каждом открытии какой-либо базы данных вы должны передавать ее пароль через свойство DBPROP_ SSCE_DBPASSWORD из набора свойств специфичного для провайдера. А при создании новой базы данных это свойство позволяет задать пароль для нее.

Теперь поддерживаются и внутренние функции, которые знают и любят пользователи SQL Server 2000. Для выполнения операций и возврата ска лярных значений в запросах можно вызывать строковые и системные функции. Ранее для этого приходилось использовать функ ции Visual Basic (или Visual Применение внут ренних функций дает потрясающий прирост производительности по срав нению с SQL Server CE 1.0.

Пример на рис. 1 демонстрирует, как преобразовать поле в char(50) для облегчения форматирования результатов запроса, которыми заполняется список элемента управления ListBox. В SQL Server CE конструкция UNI ON в операторе SELECT создает из результатов двух и более запросов единый набор результатов Ч множество строк, возвращаемых всеми зап росами в объединении. Следующий фрагмент кода показывает, как ис пользовать новую конструкцию UNION в операторе SELECT:

Dim As String = "SELECT * FROM TableA UNION SELECT * FROM В SQL Server CE 2.0 добавлена поддержка параметризованных запросов через ADO.NET. Эта функция доступна и разработчикам, использующим eMbedded Visual Tools с провайдером OLE DBCE. Кто знаком с пара метризованными запросами в SQL Server 2000, сразу заметит отличия. поскольку в SQL Server СЕ нет встроенного механиз ма для хранения запросов, параметры в действительности являются сим волами подстановки для значений, предоставляемых в период вы полнения. Во-вторых, в SQL Server СЕ нет поддержки именованных пара метров. Следующий код демонстрирует новинку SQL Server СЕ 2.0 поддержку параметризованных запросов:

Dim As String = _ "INSERT INTO TableA VALUES (?, ?)";

Рие. 1. Поддержка Dim strSQL As String "SELECT title), As New класса чтения данных для списка ceDr As Try Catch a As SqlCeException As New ' Создать Dim As Hew With ' Задать размеры и списка = New 160) = 64) Добавить на форму fle.Controls.Add(HstBox1} While With Catch a As Catch a As Exception Try см. след. стр.

Компактные и надежные на основе SQL Server CE 2. Рис. 1. Поддержка внутренних a As End Еще одна новая функция Ч извлечение индекса (index pull). Приложения вызывают метод Pull для извлечения информации из базы данных SQL Server и сохранения ее в таблице базы данных SQL Server СЕ. В первой версии SQL Server СЕ можно извлечь из таблицы лишь значения первич ного а в SQL Server CE 2.0 Ч и все дополнительные индексы.

Применение в приложениях этой функции с соответствующими парамет рами позволяет отслеживать изменения в таблице SQL Server CE, напри мер все вставки, обновления и удаления (рис. 2).

2. метода Pull объект As New = * FROM = & _ Initial = ' таблицу a As End Try Следующее усовершенствование в SQL Server CE коснулось обработки ошибок, которая более надежна, чем в предыдущей версии. Как видно из уже показанных фрагментов кода, приложения, написанные на Visual Basic и С# с применением Compact Framework, могут исполь зовать встроенную поддержку блоков try/catch. Если вы писали приложе ния для настольных систем в Visual Studio то скорее всего знакомы с подобным стилем обработки исключений. Эту новинку по достоинству оценят разработчики, пишущие на Visual Basic, до сих пор вы SQL Server обрабатывать ошибки в стиле On Error В дополнение к блокам try/catch в SQL Server СЕ добавлен новый класс SqlCeException, позволяющий перехватывать и корректно обрабатывать встроенные исключений.

В отличие от SQL Server CE 1.0 в новом выпуске разработчикам доступ ны не только коды, но и развернутые описания ошибок. Механизм описа ния ошибок реализован как необязательная DLL. При отладке эту DLL можно хранить на устройстве в каталоге приложения SQL Server СЕ, а по завершении отладки Ч удалить ее.

Серверные средства В SQL Server CE 2.0 есть новый мастер Connectivity Setup Wizard, облег чающий создание виртуальных каталогов и разрешений на доступ к дан ным (рис. 3). Пользователи предыдущих версий SQL Server CE что для взаимодействия SQL Server с устройствами, работающими под управ лением SQL Server CE, нужны определенные виртуальные каталоги и пра ва доступа. Новый мастер позволяет создавать на компьютере, где установ лен Microsoft Internet Information Services (IIS), виртуальные каталоги и управлять ими, Кроме того, при помощи этого мастера можно конфигури ровать и настраивать NTFS на компьютере с IIS и SQL Server.

CE - SOI ! j CE foldia should contain the Agent -.

the HTTP the by CE ' !: '- '.

Г fi< Рис. 3. Wizard Компактные и на основе SQL Server CE 2.0 Как и в предыдущей версии SQL Server СЕ, при работе под управлением IIS в новой версии для взаимодействия между Windows СЕ и SQL Server 2000 используется библиотека DLL. Таким образом, если устрой ство имеет доступ к виртуальному каталогу SQL Server СЕ через HTTP (т. е. просмотр этого каталога через Pocket Internet Explorer), оно может подключаться к серверной базе данных с использованием Re mote Data Access (RDA) или Merge Replication.

Как и в прежней версии SQL Server СЕ, локальную базу данных можно защищать только паролем или паролем и 128-битным шифрованием. Если локальная база данных защищена к ней нельзя получить доступ программным способом, но это не мешает просмотру файла базы данных как обычного текстового файла.

Используя защиту паролем вместе с шифрованием, вы не только блокиру ете программный доступ, но и шифруете данные. При использовании рас Pocket PC 2002 по умолчанию устанавливается библиотека, обеспечивающая более стойкую защиту с применени ем алгоритма со 128-битным ключом. Если же у вас имеется лишь стандартная версия Pocket PC 2002, скачайте соответствующий пакет с В настоящее время Microsoft рекомендует использовать SSL в IIS и аутен тификацию Basic Authentication. В будущем Microsoft планирует добавить в Windows CE (версий 4.x и выше) поддержку что позво лит делегировать удостоверения защиты (credentials) между Windows 2000 Server (или Server) и Когда начнется выпуск устройств, оснащенных Windows CE в комплект постав ки SQL Server CE 2.0 будет включена документация на Kerberos.

Благодаря еще одному усовершенствованию SQL Server CE 2.0 теперь поддерживает столько же индексов, сколько SQL Server 2000. Если первая версия SQL Server CE поддерживала не более 32 индексов, то нынеш няя Ч до 249.

С SQL Server CE 2.0 также поставляется компонент SQL Server Client Data Provider. Этот компонент, реализованный как управляемая оболоч ка, позволяет приложениям взаимодействовать непосредственно с сервер ной базой данных SQL Server. Его, видимо, лучше использовать только при наличии постоянного подключения к сети, когда потребность в ло кальном хранилище данных отсутствует.

Кроме того, через SQL Server Client Data Provider можно выдавать запро сы к SQL Server для выборки данных с последующей записью их в локаль ную базу данных SQL Server CE.

Microsoft SQL Server В SQL Server CE 2.0 также существенно улучшен ISQLW Ч эквивалент Enterprise Manager из SQL Server (рис. 4). ISQLW автоматически устанав ливается в меню Start устройства при установке Visual Studio SDE или приложения eMbedded Visual Tools.

Рис. 4. ISQLW В прежней версии ISQLW не было простого способа просмотра схемы базы данных, поэтому писать запросы было трудно, если только не выу чить всю схему наизусть. Теперь объекты базы данных доступны для про смотра в виде дерева, почти как в Query Analyzer из SQL Server для на стольных систем.

SQL Server CE 2.0 поддерживает два основных способа подключения к серверным базам данных SQL Server: через RDA или через Merge Replica tion. Доступ через RDA обеспечивает взаимодействие с SQL Server 7.0 (и выше). Merge Replication требует наличия SQL Server 2000. Схема между базами данных SQL Server CE и SQL Server показана на рис. 5.

Механизм RDA в SQL Server CE 2.0 позволяет приложению Windows CE легко извлекать информацию из таблицы удаленной базы данных SQL Server и сохранять ее в таблице локальной базы данных, после чего при ложение может читать и модифицировать эту таблицу. В дальнейшем оно может инициировать передачу модифицированных записей из локальной таблицы обратно в таблицу SQL Server.

Приложения Windows CE также могут передавать через RDA команды SQL применительно к базе данных SQL Server, например, для вставки, обновления или удаления строк.

м приложения на основе SQL Server 2. Т SOL Client СЕ SQL CE out SQL Reconciler Рис. 5. Взаимодействие между SQL Server и SQL Server CE В SQL Server СЕ механизм RDA работает через Интернет. Иначе SQL Server СЕ взаимодействует с базой данных SQL Server через IIS. Благодаря этому RDA доступны службы аутентификации и ав торизации IIS. Так как взаимодействие осуществляется по протоколу HTTP, машина под управлением SQL Server может находиться за бранд мауэром, а доступ к ней может быть получен по правилу публикации (publishing rule) через Microsoft ISA Server (или Microsoft Proxy Server).

Для уменьшения объема передаваемых данных RDA применяет сжатие, что позволяет эффективно использовать RDA с беспроводными транспор тными протоколами. При желании конфиденциальные пользовательские данные можно защищать шифрованием. RDA поддерживает обра ботку коммуникационных ошибок: в случае неудачи данные передаются повторно, начиная с последнего успешно переданного содержимого буфе ра 250 SQL Server Элемент управления RDA предоставляет программный доступ к базе дан ных SQL Server 2000 или SQL Server 7,0. Доступ через RDA поддержива ется Visual Studio и Visual Tools.

В SQL Server СЕ функция Merge Replication основана на механизмах SQL Server 2000 и использует ту же модель лиздатель-подписчик (Publisher/ Subscriber). Merge Replication позволяет независимо обновлять данные на устройстве и на сервере, а позднее, при подключении устройства к серве ру, синхронизировать их. Чтобы создать подписку, вы должны сначала настроить репликацию в SQL Server 2000, создать публикацию SQL Server (в том числе каталог моментальных снимков для хранения опубли кованных данных) и разрешить анонимные подписки.

У объекта Replication в SQL Server СЕ имеются методы для и удаления подписки, а также для инициализации, вызова и завершения Merge Replication к конкретной подписке. Этот объект SQL Server устроен сложнее, чем RDA, но его легко программировать при правильной настройке.

Другое замечательное новшество SQL Server СЕ 2.0 Ч появление провай дера (или оболочки) SQL Server CE Managed Provider, го уровень взаимодействия с мобильными приложениями, написанными на Visual Basic и С# с использованием Compact Framework.

Если вам доводилось работать с в настольных приложениях, то и SQL Server CE Managed Provider в сочетании с Compact Frame не доставит вам неудобств. Эта модель программирования предостав ляет интуитивно понятный способ взаимодействия с базой данных SQL Server CE.

В действительности эта оболочка использует родные библиотеки SQL Server CE. Изящество такого решения в том, что оно позволяет приложе нию, написанному на eMbedded Visual Basic (или eMbedded Visual C++), мирно сосуществовать с приложением, созданном средствами Visual Stu dio Однако это не подразумевает параллельного доступа к одной и той же базе данных SQL Server CE: просто приложения, рассчитанные на эти платформы, могут сосуществовать на одном устройстве. SQL Server СЕ Ч однопользовательская СУБД.

Для поддержки управляемого кода, использующего Compact Frame work, в SQL Server CE 2.0 введено два новых пространства имен;

System.

и Появился и класс для поддержки блоков /catch в языках Basic и С#.

Компактные и надежные приложения основе SQL Server CE 2. какую мощь дает применение приложениях новой оболоч ки управляемого кода, использующей Merge Replication, если вызовом единственного метода Synchronize можно полностью скопировать на уст ройство схему базы данных и ее информацию, не ни строчки кода на языке описания данных (DDL).

Пишем приложение А теперь проиллюстрируем новые функции SQL Server CE 2.0 на приме ре реального кода. Для этого напишем на простое приложение Smart Device, используя Visual Studio и Compact Framework. Чтобы упростить разработку и тестирование этого приложения, возьмем эмуля тор Pocket PC 2002.

Для нашего примера мы задействуем базу данных, устанавливаемую при установке приложения-примера из Compact Frame work SDK. Если Ч ветеран для SQL Server, то на верняка знакомы с базой данных Northwind из SQL Server 2000. В Nor thwindCE есть сценарий установки SetupRepl.bat, создающий копию базы данных Этот сценарий также устанавливает на компьютер с SQL Server 2000 компоненты Publisher и локальный Distributor. Далее он создает на основе базы данных публикацию SQLCERepl DemoNet для репликации со слиянием. Мы сделаем наше приложение подписчиком этой публикации.

SQL Server Look help Is О Console Root N Hi SQL Servers Group (Windows NT) Databases О Data Management Anonymous Publications Anonymous Anonymous Monitor Publishers -i Agents О Replication * Support Data Services ;

Рис. 6. Новая публикация SQL Server Сконфигурируйте свой экземпляр SQL Server так, чтобы в репликации он играл роль Publisher/Distributor, и создайте каталог моментальных сним ков с соответствующими разрешениями, а затем запустите сценарий Se из Если все пройдет удач но, вы увидите новую публикацию (рис. 6).

Обзор приложения Разработанное нами приложение иллюстрирует некоторые из обсуждав шихся ранее новых возможностей SQL Server CE 2.0, в том числе репли кацию через метод Мы также продемонстри руем полную (двухстороннюю) синхронизацию базы данных СЕ (хранящуюся на компьютере с SQL Server 2000) с локальной базой данных подписок SQL Server СЕ и ряд других средств, например SqlCeException и параметризованные запросы, приложения показана на рис. 7. Приложение позволяет запрашивать таблицу Employees локальной базы данных подпи сок, вводя часть значения поля как критерий поиска. Результа ты запроса возвращаются через элемент управления View. В меню при ложения добавлена команда Synchronize, которая заставляет реплициро вать все изменения в базе данных SQL Server 2000 в нашу локальную базу данных SQL Server СЕ. Наверное, SmartDevice Ч не самое потрясающее приложение, зато его реализация весьма интересна!

: Last Name:

" Х Х Now ;

EX* Рис. 7. Windows-форма Прежде чем начать, запустите сценарий SetupRepl.bat из NorthwindCE, a в SQL Server CE Server Agent сконфигурируйте виртуальный каталог IIS с именем открытый для анонимного доступа через HTTP (надеюсь, вы понимаете, что такая политика доступа не годится для рабочего Проверить необходимые настройки можно через оснастку SQL Server СЕ Connectivity Management, поставляемую с SQL Server CE 2. для консоли Первая часть кода демонстрирует, как создать пустую базу данных через объект в SQL Server СЕ и синхронизировать ее с существую щей публикацией SQL Server для базы через объ ект Replication. Функция DBInit, вызываемая обработчиком создает пустую базу данных подписки (если ее еще нет) и обращается к чтобы синхронизировать базу данных публикации с базой дан ных подписки (рис. 8).

Рис. 8. Создание и базы private void I try if < SqlCeEngine = + catch (SqlCeException ex) ex) В методе все значения свойств объекта Replication зашиты в код лишь для наглядности. В реальных приложениях их следует хранить в таблице SQL или XML-файле. В нашем примере используется аутенти фикация SQL Server. Метод Synchronize создает базу данных подписки и реплицирует в нее полную схему объектов базы данных публикации вме сте с индексами (рис. 9).

После создания базы данных подписки и после репликации в нее всех объектов публикации приложение сможет работать в автономном режиме. При следующем вызове метода DBSync базы данных SQL Server Microsoft SQL Server 2000 и SQL Server СЕ обменяются модифицированными записями за счет репликации со слиянием.

Рис. 9. Синхронизирующий метод private void // Создать экземпляр Replication SqlCeReplication - new SqlCeReplicationO;

try // Задать свойства = Publication // Задать для издателя = "sa";

"sa";

// Задать саойства подписчика Data * * // Задать саойства для = // полную = catch ex) catch ex) finally и основе SQL CE 2. Заметьте, что для перехвата исключений в SDE-приложении применяют ся блоки try/catch/finally. Метод показывает детальные сведе ния об исключениях SQL Server СЕ. Код на рис. 10 демонстрирует рас крутку (unwinding) стека исключений SQL Server СЕ и вывод сообщения об ошибке на клиенте.

Рис. 10. Перехват исключений static void ex) oErrors = Exception = foreach (SqlCeError oErrors) + ;

+ + : + in if 0) Par. :

foreach (String sErrPar in if (sErrPar Err. Par.

Напоследок обсудим код метода Find Employees, вызываемого обработчи ком события Click кнопки Find Now. Сначала мы создаем экземпляр объ екта SqlCeConnection и подключаемся к локальной базе данных подписки.

Далее создается объект SqlCeCommand с параметризованным запросом к таблице Employees (рис. 11). Обратите внимание на вызовы внутренней функции удаляющие концевые пробелы в полях и для упрощения форматирования этих полей в 256 Microsoft Server Рис, 11. Удаление концевых пробелов private void { // Создать new try = "SELECT + + AS mm LIKE ? BY критерий поиска параметр + = элемент управления while String ex) catch и соединение if if Х Компактные и SQL Server CE 2. Набор Parameters объекта SqlCeCommand передать шаблон по иска оператору LIKE в конструкции SELECT. Мы используем объект для выполнения запроса и заполнения элемента управ ления View. Наконец, ранее открытое соединение с базой данных под писки закрывается и освобождается.

Как выглядит законченное приложение в эмуляторе Pocket PC 2002 Emu lator, показано на рис. 12.

PC Help I ID Л * CaSahan, Laura :

Anne Fuller, Robert Levelling, Рис. 12. Приложение в эмуляторе Pocket PC Что следует учесть при установке Пара слов о том, что нужно учесть при установке приложений. Сама по себе SQL Server СЕ чрезвычайно надежна, но устройства, на которых она работает, подвержены сбоям (в частности, из-за ограниченного ресурса аккумуляторов). Следовательно, при разработке любого мобильного реше ния нужно помнить о восстановлении после сбоев.

Надежное хранилище данных можно создать на основе технологий энер гонезависимой памяти вроде CF Media. Чтобы пользователи могли восста новить данные после закончившегося холодной перезагрузкой ус 9- 258 Microsoft SQL Server следует размещать базу данных и исполняемые файлы приложе ния на карте CF. Кроме того, создав САВ-файл для своего приложения, вы существенно упростите его установку вне офиса.

SQL Server CE 2.0 Ч стимул к действию SQL Server CE 2.0 позволит решения в об ласти управления данными для мобильных устройств. Новая версия SQL Server CE Ч настоящий в функциональности и производительно сти по сравнению с предыдущей версией. Мы советуем всем опробовать эту замечательную СУБД, и лучший способ сделать это Ч самому создать приложение для мобильных устройств. SQL Server CE 2.0 мож но скачать по ссылке Марк Браун Brown) Ч главный архитектор ПО, а Дэвид (David Ч ведущий инженер ПО в компании Inc. ( www.identitymine.com), является независимым поставщиком ПО (Такома, штат Вашингтон). IdentityMine занимается проектированием и реализацией бизнес-решений следующего поколения с применением серверных Microsoft Enterprise. С авторами можно связать ся по адресам mark.brown@identityrnine.com и david.meunier@identitymine.com соответственно.

Марк Браун Доставка информации в реальном времени с применением Notification Популярность беспроводных устройств постоянно растет, и организации ищут новые способы установления контактов с пользователями этих мобильных устройств. Раньше для целевой рассылки информации клиентам применялись (push technology). Теперь с появлением службы Notification Services, использующей ядро баз данных SQL Server 2000 и платформу Framework, стала возмож ной разработка уведомляющих приложений (notification applications) нового поколения, которые позволяют отправлять на любые мобильные устройства информацию, интересующую подписчиков таких приложений.

Автор рассматривает архитектуру основной функциональности службы Notification Services в SQL Server. Кроме он поясняет, как использовать эту службу для доставки (информационного наполнения).

С середины 90-х провайдеры контента и услуг создали бессчетное множе ство схем генерации и доставки пользователям информации и уведомле ний, или (alerts). К сожалению, технологии доставки из-за ей природы с годами приобрели плохую репутацию, Реализация многих методов доставки оставляла желать полоса пропускания сетей использовалась слишком интенсивно, а некоторые со общения были весьма назойливы и имели сомнительную ценность.

* в Magazine/Русская 2002. (ноябрь). Ч Прим.

260 SQL Server Провал ранних вариантов модели доставки можно отчасти объяснить от сутствием стандартов на службы уведомления. Однако, очевидно, что тра диционные формы этой модели были обречены на неудачу прежде всего из-за громоздких схем которые не масштабировались, и из-за невозможности более тонкого управления подпиской. Вдобавок большин ство служб уведомления для доставки сообщений и контента требовало специализированных клиентских приложений или Web-браузеров с под держкой соответствующих технологий. Также не было никаких что уведомления попадут действительно к тому, кому они нужны.

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

что разработка своего уведомляющего приложения и соответ ствующей инфраструктуры Ч весьма тяжелая задача для любой организа ции, при решении которой может возникнуть масса проблем. Из-за мно гочисленных ограничений во многих современных приложениях доставки уведомлений и контента прибегают к широко распространенной и простой в использовании электронной почте (протокол SMTP) или системе обме на текстовыми сообщениями Однако эти приложения по-прежне му опираются на собственные схемы сбора событий, генерации уведомле ний и управления подпиской.

В последние несколько лет появились более эффективные протоколы, раз работанные для передачи уведомлений. Эти протоколы обладают высокой масштабируемостью, большей надежностью и защитой. С повсеместным распространением беспроводных мобильных устройств и инфраструктур, обеспечивающих доставку сообщений почти в реальном времени мер, SMS, WAP, Instant Messaging и Microsoft Alerts), компании на чинают осознавать, что им нужна мощная платформа для способная задействовать возможности этих каналов доставки.

Беспроводные устройства нового поколения с поддержкой доступа к Ин тернету смогут передавать информацию о местонахождении пользователя через интегрированную GPS (Global Positioning System). Операторы бес проводной связи получат возможность безопасной доставки такой инфор мации через Web-сервисы (с согласия пользователя и при условии сохра нения конфиденциальности). Появление информации о местонахождении в реальном пользователя в сочетании с мощной платформой для уведомлений приве дет к созданию нового поколения уведомляющих приложений.

Перспективы бизнеса на новом рынке К типичным уведомлениям относятся напоминания клиентам и сотрудни кам о мероприятиях и запланированных встречах, извещения о доставке грузов, финансовые и биржевые горячие новости, отчеты о си туации на дорогах и даже результаты спортивных матчей.

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

Благодаря последним достижениям производителей мобильных устройств и лавинообразному росту популярности Web-сервисов теперь гораздо про ще связаться с кем угодно Ч в любом месте и в любое время. С распрост ранением таких мобильных устройств, как смартфоны, PDA, устройства для работы с электронной почтой, компании вновь ищут спо собы своевременной доставки пользователям персонализированной ин формации.

Однако сейчас основное внимание уделяется тому, чтобы клиентам посы лались сообщения только по интересующим их вопросам. Такие сообще ния должны побуждать клиентов посетить Web-сайт компании в поисках дополнительной информации или для размещения заказа. Все это, несом ненно, открывает компаниям новые возможности в получении прибыли.

Использование новых возможностей Notification Services в SQL Server Ч новая платформа приложений, снима ющая ограничения традиционных технологий доставки. Она использует модель в которой доставка контента всегда согла суется с клиентом. Уведомления отправляются только тем, кто подписал ся на их получение. Сообщения можно форматировать в соответствии с требованиями устройств разных типов, а информационное наполнение Ч приводить в соответствие с личными предпочтениями подписчика. Это позволяет воспользоваться на рынке возможностями как мелким компаниям, так и крупным предприятиям.

Платформа Notification Services предоставляет разработчикам интуитив но понятную модель создания централизованных уведомляющих прило жений и их развертывания в любом масштабе. Она использует простую 262 Microsoft SQL Server инфраструктуру декларативною программирования, на язы ках, уже известных разработчикам, например на и XML.

Кроме того, Notification предназначена для бесшовной интеграции с приложениями сторонних с провайдерами событий и службами доставки, которые, возможно, работают в операционных систе мах, отличных от Windows. Так как платформа Notification Services ограж дает разработчика от сложностей, связанных с генерацией и типичное уведомляющее приложение можно создать и развернуть очень быстро.

Архитектура Notification Services Рассмотрим высокоуровневую архитектуру службы Notification Services в SQL Server, чтобы понять, как разработчики уведомляющих приложений могут задействовать богатые возможности этой платформы для достиже ния максимальной продуктивности своего труда.

Основное требование к любому уведомляющему приложению Ч способ ность собирать события, сравнивать их с предпочтениями подписчика (подписками), генерировать и форматировать уведомления и в конечном счете доставлять сообщения на устройства подписчика. Платформа Noti fication Services предоставляет всю эту функциональность и инфраструк туру, быстро создавать и развертывать уведомляющие при ложения.

Notification Services позволяет данные о подписке и подписчиках и управлять ими через Notification Services API. Вы можете собирать со бытия, получаемые из самых разнообразных внешних источников с помо щью стандартных или собственных провайдеров событий. Эти события можно сравнивать с предпочтениями индивидуальных подписчиков по факту возникновения событий по расписанию, а затем генерировать уведомления. Наконец, можно форматировать уведомления в соответ ствии с типом используемого подписчиком, и его региональ ными стандартами, после чего передавать уведомления внешней службе доставки.

Ключевая особенность архитектуры Notification Services в том, что служ бы доставки отделены от средств генерации уведомлений.

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

Распределенная архитектура позволяет рассредоточить компоненты и службы, необходимые для выполнения уведомляющего приложения, по нескольким компьютерам. В следующих разделах я подробно рассмотрю основные особенности архитектуры всех базовых компонентов Notification Services.

Доставка информации 8 Архитектура управления Подписки Ч функциональность любого уведомля ющего так как именно они определяют, что и когда получит подписчик. Кроме того, в подписке может быть указано определенное ус тройство, на которое следует отправлять уведомления.

Подписки бывают двух категорий: по расписанию (scheduled subscriptions) и управляемые событиями (event-driven subscriptions). В нервом случае уведомления в соответствии с календарной датой, временем дня, заданной периодичностью или по определенным дням недели (все параметры можно комбинировать). Во втором Ч уведомления доставляют ся сразу после получения события от внешнего источника.

Поскольку каждое уведомляющее уникально, вам придется создать собственный компонент для управления своими подписчиками их предпочтениями. Такой называется приложением управле ния подпиской (subscription management application).

Приложения управления подпиской обычно разрабатываются как Web приложения на основе ASP или ASP.NET. Однако с помощью Notification Services API вы можете создать его как стандартное Windows-приложение.

Высокоуровневая архитектура приложения подпиской пока зана на рис. 1.

API Л Рис. 1. Приложение управления подпиской Учтите, что в терминологии Notification Services под данными подписчи ка (subscriber data) подразумевается информация о подписчике и его уст а под данными подписки (subscription data) Ч информация о конкретных классах событий, интересующих подписчика, и соответствую щие параметры.

264 SQL Server Notification Services API В Notification Services информация о подписчике, устройстве и подписке помещается в центральную базу данных этой службы, за счет чего данные подписчика хранятся в одном экземпляре, а данные подписки могут быть разными для каждого уведомляющего приложения.

Notification Services API позволяет создавать данные подписчика и управ лять ими через классы управляемого кода (или COM Interop) с ванием перечислимых (enumerations). Эти классы значительно упрощают создание приложений управления подпиской, абстрагируя доступ к базе данных.

Классы событий и ADF В Notification Services событием называется некое обстоятельство или ус о котором хочет получить уведомление. Создание уве домляющих приложений практически полностью основано на событиях.

Чтобы приложение могло события, сначала опишите классы событий с помощью XML-файла метаданных, также называемого файлом определения приложения (application definition file, ADF). ADF описыва ет данные и структуру приложения Notification Services. В ADF обычно определяется один или несколько классов событий.

Рис. 2 показывает, как создается класс события Stock с использованием ADF. Обратите внимание на как объявлена структура данных этого класса события в разделе узла Также заметьте, что для описания типа данных события в элементе использу ются синтаксические Раздел указывает, может ли поле содержать пустые значения.

Рис. 2. Определение класса определения класса события класса события в разделе поле для обозначения акционерной компаний которой на см. след. стр.

Доставка в Рис. 2. класса для ;

Эта схема нужна провайдерам событий для проверки допустимости дан ных события. На основе определенных в ней полей при создании нового экземпляра приложения в базе данных этого приложения автоматически генерируется таблица SQL Server, в которой сохраняются данные события.

Теперь, когда вы получили первое представление о том, как определяют ся события в приложении Notification Services, рассмотрим архитектуру сбора событий.

Архитектура сбора событий Платформа Notification Services позволяет собирать данные событий из самых разнообразных источников с помощью провайдеров событий (event providers). Провайдеры событий могут быть реализованы в виде DLL, раз мещаемые в самой Notification Services, или как внешние исполняемые файлы. Провайдеры событий первого вида могут выполняться постоянно или по расписанию.

Провайдеры событий отвечают за мониторинг источника событий и пос ледующую запись данных события в таблицу событий уведомляющего приложения. Они могут передавать события в базу данных приложения через три API. Первый из них Ч API управляемого кода, позволяющий записывать данные прямо в таблицу событий (этот API может предостав ляться через COM Interop в виде интерфейсов). Второй Ч XML API, рас считанный на пакетную загрузку и запись событий в таблицу событий из XML-документа или потока (stream). И третий Ч хранимые которые разработчик может вызывать для прямой загрузки данных собы тия из объектов базы данных и их записи в таблицу событий.

Хотя события добавляются в таблицу по одной записи единовременно, провайдеры обычно отправляют события службам Notification Services группами, называемыми пакетами (batches). После передачи пакета про Microsoft SQL Server событий уведомляющее приложение может сразу же заняться обработкой событий, к генерации уведомлений. Одна ко уведомляющее приложение может отложить обработку событий соглас но расписанию. архитектура провайдера событий пока зана на рис. 3.

Рис. 3. Архитектура провайдера событий Модели сбора событий Провайдеры событий могут за данными и собирать их многи ми способами. Однако большинство провайдеров, как правило, работает по одной из двух При использовании компонента сбора оповеще нием (push collector) или сбора опросом (pull collector) события либо дос тавляются (push) провайдеру либо запрашиваются (pull) от внешнего ис точника по расписанию. В модели на основе расписания или в модели, управляемой событиями, провайдер событий может запускаться периоди чески Ч так, как задано приложением. Возможен и другой вариант: про вайдер, напротив, ведет непрерывный мониторинг событий (или ожидает обратного вызова), чтобы сразу после того, как событие станет доступно, отправить его службе Services.

Стандартные и нестандартные провайдеры событий Платформа Notification Services включает два стандартных провайдера событий: File System Watcher Event Provider и SQL Server Event Provider.

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

File System Watcher Event Provider наблюдает за файлами, добавляемыми в каталог файловой системы. Единственное требование заключается в том, Доставка информации в реальном что это должны быть синтаксически корректные (welt-formed) XML-фай лы. Когда в каталог, указанный разработчиком, помещается новый файл.

File System Watcher Event Provider выполняет массовую загрузку XML данных события в память через XML API, который в свою очередь запи сывает события в таблицу событий уведомляющего приложения. Затем исходный файл переименовывается, чтобы было видно: он уже обработан.

SQL Server Event Provider извлекает данные события прямо из таблицы базы данных по запросу на языке Для сбора данных новых собы тий и их записи в таблицу событий этот провайдер использует хранимые процедуры, о которых я уже говорил. Кроме того, он позволяет выполнять пре- и постпроцессную обработку событий в течение интервала сбора (collection interval), определенного приложением.

Конечно, на основе ранее упомянутых API можно создавать более гибкие нестандартные провайдеры событий. А это дает возможность наблюдать практически за любым внешним источником событий (например, за Web сервисами, почтовыми серверами, Web-сайтами) и передавать его события службе Notification Services для дальнейшей обработки.

Хронологии событий Еще одна особенность архитектуры сбора событий Ч поддержка хроноло гии событий (event chronicles). Полное объяснение того, как их можно использовать в уведомляющем приложении, я приведу в следующем раз деле. А пока скажу, что пакет событий обрабатывается только в процессе генерации уведомлений (не считая случаев системных сбоев и перезагру зок), и таблицы хронологии событий позволяют в этот период сохранять (или архивировать) данные событий для последующей обработки.

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

Центральное место в Notification Services занимает генератор уведомлений (notification generator). Его задача Ч сравнить собранные события с под писками и определить, выполнены ли условия, необходимые для генера ции неформатированного уведомления (raw notification). Такое уведомле ние содержит неформатированные данные события, к которым относится информация, требуемая для передачи например сведения о подписчике и об устройстве, которое он использует. Форматирование и доставка уведомления выполняются отдельным процессом (см. раздел Архитектура форматирования и доставки 268 SQL Условия генерации формулируются в виде правил подписки на события.

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

При генерации уведомлений могут использоваться и данные предыдущих событий, хранящиеся в таблице хронологии. Это позволяет создавать сложные правила, основанные на состоянии, в которых новые события с предыдущими и тем самым определяется, надо ли ровать дополнительное уведомление (рис. 4).

Рис, 4. Обработка подписок После генерации уведомление еще не готово к отправке подписчику. Сна чала оно записывается во таблицу уведомлений вместе с ин формацией об исходном подписчике, устройстве, на которое выполняется доставка, и прочими данными, необходимыми для передачи сообщения.

По аналогии с как провайдер событий записывает пакеты событий для последующей обработки генератором уведомлений, последний запи сывает уведомления, готовые к доставке, тоже пакетами. Дистрибутор уве домлений (notification distributor) в свою очередь обрабатывает пакеты неформатированных уведомлений и преобразует их в удобочитаемые со общения, форматированные в соответствии с требованиями устройства, на которое они передаются, Архитектура форматирования и доставки уведомлений На этой стадии процесса неформатированные уведомления, созданные генератором, хранятся в таблицах уведомляющего приложения в виде па кетов. После закрытия пакета уведомлений генератором эти уведомления готовы к форматированию и доставке подписчикам дистрибутором (рис. 5).

Доставка информации Данные Компонент, I 1 В;

С Рис. 5. Форматирование и доставка уведомлений Для большей производительности дистрибутор обрабатывает сразу не сколько пакетов используя пул потоков (threads). Пакеты состоят всех уведомлений, которые будут переданы по одному каналу Это позволяет распределить рабочую нагрузку между несколь кими логическими системами доставки, После того как дистрибутор выбрал пакет для обработки, уведомления, адресованные одному и тому же подписчику, в единое уве домление, называемое сводным (digest Кроме того, компо нент, объединяющий уведомления (aggregator), способен оптимизировать форматирование в тех случаях, когда содержимое уведомления для не скольких подписчиков одинаково (или похоже). Тогда данные уведомле ний, общие для группы подписчиков, форматируются только один раз.

Компонент, форматирующий контент (content formatter), на основе ин формации о (типа устройства подписчика, сетевого адреса, канала доставки и определяет, как должен выглядеть контент.

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

После форматирования уведомления передаются доступному каналу дос тавки для передачи подписчику. Каналы доставки формируют из уведом лений сообщения, специфичные для применяемого протокола, и направ ляют их внешней системе доставки. Обычно каналы доставки используют общеизвестные протоколы типа SMTP;

Pages:     | 1 | 2 | 3 | 4 | 5 |    Книги, научные публикации