WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 | 2 || 4 | 5 |   ...   | 6 |

«Вячеславович Фролов, Григорий Вячеславович Фролов в Интернете практическое руководство по созданию Web-приложений с базами данных Издание исправленное УДК 004.7 ББК 32.973.202 Фролов А. В., Фролов Г. ...»

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

Листинг 4-3 хранится в файле на прилага емом к книге компакт-диске.

Ограничение CONSTRAINT на поле автоматизирует записи даты добавления книги в таблицу books:

CREATE TABLE ( [bOOksID] [int] (1, 1) NOT NULL, [Author] [varchar] (50) NOT NULL, [Title] [varchar] (200) NOT NULL, [Publisher] [varchar] (50) NOT NULL, [Price] [money] NOT NULL, [AddDate] NOT NULL CONSTRAINT DEFAULT [Annotation] [varchar] (2048) NOT NULL, CONSTRAINT PRIMARY KEY ( [booksID] ) ON [PRIMARY] ) ON [PRIMARY] Ни одно из полей данной не может содержать пустые значения NULL, поэтому при добавлении книги в базу данных предоставить полную информацию о ней.

Таблица orders Когда покупатели отбирают понравившиеся им книги для покупки, записи до в таблицу orders. Поля этой таблицы описаны Таблица 4-9. Поля таблицы orders Поле Тип Int записи таблицы orders (ключевое поле) booksID Int Идентификатор книги, для покупки ClientID Int выбравшего данную книгу AddDate Datetime Дата и время отбора книги money отобранной книги в условных Поля booksID и ClientID собой внешние ключи к таблицам books и clients соответственно. Используя эти поля, мы можем определить, ка кую книгу отобрал тот или иной покупатель.

Глава 4. Связь приложений с данных через ADO Поле хранящее дату и время книги, применяют для очистки корзин от записей. Например, Вы можете принуди тельно удалять записи об отобранных книгах, сделанные более года назад.

Сценарий SQL, создающий таблицу orders, представлен в 4-4.

Листинг 4-4 Вы найдете в файле на при лагаемом к книге компакт-диске.

Обратите на ограничение CONSTRAINT поля AddDate:

CREATE TABLE ( [ordersID] [int] IDENTITY (1, 1) NOT NULL, [int] NOT NULL, [ClientID] [int] NOT NULL, [AddDate] NOT NULL CONSTRAINT [DF_orders_AddDate] DEFAULT [money] NOT NULL, CONSTRAINT [PK_orders] PRIMARY KEY С [ordersID] ) ON [PRIMARY] ) ON С его помощью в данное автоматически время и дата до бавления книги в корзину покупателя.

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

Для примера мы привели в листинге 4-5 текст хранимой процеду ры ClientLogin. предназначенной для подключения к Интернет-магазину заре гистрированных покупателей.

Листинг 4-5 Вы найдете в файле ch4\BookShopScripts\ на прилагаемом к книге компакт-диске.

В качестве входных параметров мы передаем этой процедуре идентификатор пользователя @User и пользователя @Pass:

PROCEDURE ClientLogin varchar(50), output AS SELECT FROM clients WHERE AND UPDATE clients SET WHERE Результат аутентификации записывается процедурой ClientLogin в параметр Попутно наша процедура обновляет поле таблицы в нее время и дату подключения, полученные от встроенной функции GETDATE.

Сейчас мы не будем подробно описывать работу этой и других процедур — о ней мы расскажем в разделах, посвященных описанию страниц ASP нашего ма газина. Отметим только, что процедуры Вы добавить в базу данных при приложения SQL Server Query Analyzer.

Базы данных в Интернете.

этого не забудьте выделить Интернета на их выполнение. Для этого приложение SQL Server Enterprise Manager, откройте базу данных Bookstore и папку с хранимыми Stored Procedures. Выберите процедуру и щелчком правой клавиши мыши откройте страницу Stored Procedure Properties, рис. 4-8.

:

FROM Pas L Рис. 4-8. Страница Stored Здесь Вы можете редактировать текст процедуры. Для измене ний щелкните кнопку ОК. Что касается прав на процедуры, то их нужно добавить кнопкой Permissions. Открыв Object Properties, от метьте на вкладке Permissions в столбце EXEC в строках тех которым Вы хотите предоставить доступ на цедуры.

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

Рис. 4-9. Страница New Data Глава 4. Связь с базами данных через ADO Откройте на компьютере, играющем роль Web, папку Panel и дважды щелкните пиктограмму ODBC Data Sources. После того как на экра не появится ODBC Data Sources Administrator, откройте вкладку Sys tem DSN и нажмите кнопку Add. Вы увидите страницу мастера создания источ ников данных с названием New Data Source (рис. 4-9).

В расположенном на странице, выберите драйвер SQL Server, a затем щелкните кнопку Finish. На экране появится первая страница мастера источника для SQL Server, на рис. 4-10.

New to How do war* the Рис. Первая мастера источника данных для SQL Server В поле Name этой страницы введите имя создаваемого источника данных — BookStore. В поле Description Вы также можете описать источник данных.

Далее в списке Server выберите сервер базы к которому будет вы полняться подключение. Если серверы Web и SQL Server на одном компьютере (как у нас), нужно выбрать в этом строку (local). Если же сервер SQL Server работает на другом компьютере, в этом списке укажите нуж ный сервер базы Заполнив поля на первой странице, щелкните кнопку Next.

На следующей странице мастера (рис. 4-11) Вы должны выбрать способ при подключении к SQL Server.

t New (a SQL To to Рис. Выбор способа аутентификации Базы данных Интернете. Практическое При использовании аутентификации Windows NT Вы можете оставить пере ключатели в том положении, как они показаны на рис. 4-11. Щелчок кнопки Client Configuration позволит Вам выбрать сетевую библиотеку и указать пара метры подключения для выбранной библиотеки (рис. 4-12).

!

I РИС. 4-12. Выбор сетевой библиотеки и настройка ее параметров При создании источника для Интернет-магазина Вы можете оставить эти параметры в состоянии.

Чтобы продолжить процесс, щелкните Next в панели выбора спосо ба аутентификации, показанной на рис. 4-11. На экране появится третья мастера, на которой нужно выбрать базу данных по умолчанию (рис. 4-13).

С -:

quoted Use Рис. 4-13. Выбор базы данных по умолчанию Остальные элементы управления, расположенные в этой панели, можно не менять.

щелкните кнопку Next. В панели, показанной на рис. 4-14. укажите нужный язык системных сообщений и пометьте переключатель Use regional settings when outputting currency, numbers, dates and times.

Для работы мастера щелкните в этой панели кнопку Finish. На экране описание конфигурации источника данных (рис. 4-15).

Вам нужно работоспособность источника, например, при помощи кнопки Test Data Source. Щелкните ее, и если Вы все сделали правиль но, на экране об успешном завершении теста (рис. 4-16).

Глава 4. Связь с базами данных через ADO language E to Log Рис. 4-14. Последняя панель мастера создания источника данных A ODBC MO Yes temporal)» disconnect Quoted ANSI Yes Рис. Описание конфигурации созданного источника данных SQL Data Attempting FULLY!

. !

Рис. 4-16. Сообщение об успешной проверке источника данных Базы данных в Интернете. Практическое руководство готово для того, чтобы приступить к настройке виртуальных ка талогов сервера Web и к созданию ASP нашего Интернет-магазина.

Подготовка виртуальных каталогов сервера Web Наш Интернет-магазин состоит из двух приложений ASP. Первое предназначе но для сотрудников магазина, и мы назовем его Второе будут посетители Вашего магазина. Мы назовем его при ложением покупателя.

Виртуальный каталог приложения покупателя В виртуальном каталоге приложения покупателя хранятся страницы ASP, до ступные покупателям. Они предназначены для просмотра списка товаров (книг), отбора товаров в и расплаты за покупку.

Этот виртуальный каталог, так же как и виртуальный каталог ного средствами управляющей консоли Microsoft Mana gement Console. Укажите имя каталога как BookShopClient, проследив за тем, чтобы для были и исполнение сценариев. Для этого в панели BookShopClient Properties откройте вкладку Virtual Directory и пометь те переключатели Read и Script (если они были выключены).

Разрешите также настройку и клиентских сценариев на вкладке Арр Debugging и с помощью переключателей Enable ASP server-side script debugging и Enable ASP client-side script debugging. Для того чтобы эти изме вступили в силу, закройте панель и перезагрузите компьютер.

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

Виртуальный каталог административного приложения BookShop Этот каталог содержит страницы ASP, предназначенные для про смотра только сотрудниками Вашего магазина. Обычные посетители не долж ны иметь к никакого доступа.

Bookshop | | • Access and г Secure a a SSL tor and Name a Рис. Настройка доступа к виртуальному каталогу Глава 4. Связь приложений с базами данных ADO каталог с BookShop, воспользовавшись для этого приложением Microsoft Management Console. Для ограничения доступа отредактируйте свойства виртуального каталога BookShop, в панели BookShop Properties вкладку Directory Security (рис. 4-17).

Прежде всего, на этой вкладке Вы можете запретить доступ анонимных Интернета к данному каталогу. Для этого щелкните кнопку Edit в поле Anonymous Assess and Authentication Control. На экране появится па нель Authentication Methods (рис. 4-18).

Methods or resource Г to access Account Windows NT and * ts disabled is using Рис. Отмена доступа анонимных пользователей Снимите в этой панели у переключателя Allow Anonymous Access и оставьте ее у переключателя Windows NT Challenge/Response.

таг — создание списка адресов IP для Щелкните кнопку Edit в поле IP Address Domain Name Restrictions на Directory Security (рис. Вы увидите спис адресов IP, на рис. 4-19.

and Domain Name Address Рис. Панель IP Address Name Restrictions Отметьте этой панели переключатель Denied Access. В результате к дан ному виртуальному каталогу будет запрещен доступ со всех адресов IP, исклю перечисленных в Список редактируется с помощью Add нового Remove (удаление адреса) и Edit (редактирование адреса).

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

Базы данных в Интернете. Практическое Дополнительный уровень безопасности административного приложения ре ализуется парольной системой доступа, в само прило Приложение покупателя Приложение покупателя будут магазина, поэтому при его реализации мы решили обойтись без клиентских сценариев, Это позволило нам номенклатуру браузеров, способных правильно показывать страни цы «публичной» части чем приступить к рассказу о том, как реализовать страницы ASP приложения покупателя, рассмотрим логику его работы.

Когда посетитель попадает на эту страницу, в окне его браузера появляется форма, показанная на рис. 4-20.

для покупателей зарегистрируйтесь Рис. 4-20. Первая страница приложения покупателя Прежде всего посетитель должен зарегистрироваться, выбрав среди всего прочего идентификатор (имя для входа) и пароль. Это позволит нам не только получить информацию о покупателях, по и просто необходимо для создания в базе индивидуальных электронных «корзин», куда покупатели отклады вают товар перед оплатой.

Вам Рис. Сообщение новым покупателям о необходимости Глава 4. Связь приложений с базами данных через ADO Если посетитель зарегистрировался то, для того чтобы попасть в магазин, ему нужно ввести в поле Имя свой идентификатор, а в поле Пароль — свой пароль. Новые пользователи должны зарегистрироваться, щелкнув кноп ку Регистрация.

В тех случаях, когда идентификатор пользователя отсутствует в регистрационной базе данных или когда пароль указан неправильно, посетитель получает о необходимости регистрации (рис. 4-21).

Щелкнув ссылку Вам нужно зарегистрироваться, посетитель попадает на входную страницу, показанную на рис. 4-20.

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

Форма регистрации новых посетителей показана на рис. 4-22.

- И ' новых покупателей отмеченные нужно Иван | Русский i о v е m ei l_s Адрес уп Пер о I Не посылать в] Рис. 4-22. Форма регистрации нового покупателя Здесь посетителю предлагается ввести такие сведения, как полное его имя, выбранный идентификатор и пароль, язык, на котором следует отображать стра ницы адрес электронной и обычной почты, а также ответить на вопрос, хочет ли он получать рекламные извещения о появлении в магазине то варов.

Как мы уже говорили раньше, при описании полей таблицы clients, содер жащей сведения о поля идентификатора пользователя и электрон ного адреса сделаны уникальными. Если при регистрации посетитель укажет или адрес электронной почты, введенный ранее другим посети телем и хранящийся в базе данных, он получит сообщение об ошибке с предло жением повторить Форма с этим сообщением показана на рис. 4-23.

Базы данных в Интернете.

"3 - I..

при формы с ом и адресом уже Выберите другой Рис. 4-23. Сообщение ошибке при В случае успешной регистрации увидит на экране другое сообще ние — приглашение для входа (рис. 4-24).

Рис. 4-24. Приглашение для входа Щелкнув ссылку посетитель вновь на страни цу, на рис. 4-20. Теперь ему ввести свой и пароль, а затем кнопку Вход.

описанные выше действия, покупатель наконец на глав ную страницу магазина, из трех фреймов (рис. 4-25). Левый пред ставляет собой меню команд, состоящее всего из двух строк — Выход и Опла тить покупки. Верхний фрейм имеющихся в а в фрейме отображается содержимое корзины покупателя. При первом посещении магазина корзина пуста.

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

Как видно из рис. в правом верхнем фрейме отображается информация из таблицы books, описанной нами Эта информация вводится и редакти руется сотрудниками Вашего при административного прило жения, которое мы рассмотрим Справа от названия книги, под ее стоимостью находится ссылка, которую покупатель добавит в свою корзину. Список отобранных книг появится в правом нижнем фрейме (рис. 4-26).

Глава 4. Связь приложений с базами данных через ADO - by - - - • " _ _ _ д Сегодня в Фролов. Г.В. г для л •Русская Эта книга собой практическое руководство по Web с данных для а также Б ней смотрены с Active Pages Е Русская J..

Вы отобрали для Рис. 4-25. Страница, которая отображается при первом посещении магазина _ _ Сегодня в продаже Фролов. Г.В. Фролов.

Интернет и в редакция с по с данных а также Б ней рас созданные oft с Скотт Pages В;

АН книга....

Вы отобрали для А.Е. Фролов. Г.В. Фролов. с данных для и ' Скотт из Server Рис. 4-26. Список книг, которые покупатель отобрал в свою корзину 152 Базы данных в Интернете. Практическое руководство Ссылка Удалить из корзины позволит посетителю отказаться от покупки той или иной книги.

Вы можете рассчитать стоимость книг с учетом доставки, а также позволить посетителю указывать количество приобретаемых книг. Стоимость доставки определяется автоматически, если Вы добавите в базу данных магазина табли с о стоимости доставки для различных регионов, а при регис трации посетитель из списка город и страну проживания. Не забудьте также учесть способ доставки (поездом, самолетом, курьером и т. д.).

Кроме того, стоит создать на которой пользователь мог бы редак тировать некоторые или все регистрационной информации.

Ссылка покупки посетителю оплатить покупку или сде лать предварительный заказ. Мы рассмотрим соответствующие процедуры поз же в этой главе, а сейчас опишем тексты страниц ASP приложения покупателя.

Файл global.asa В корне виртуального каталога созданного для страниц клиен тского приложения, необходимо разместить файл (листинг 4-6).

Листинг 4-6 Вы найдете в файле на прилагае мом к книге компакт-диске.

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

Проверяя работу нашего отредактируйте путь, указанный в параметре FILE тега METADATA, таким чтобы он указывал на файл Вашего Web.

Страницы входа и начальной регистрации Несколько страниц приложения покупателя предназначены для аутентифика ции посетителей и для регистрации посетителей. Они взаимосвязаны, и поэтому мы будем рассматривать Вход зарегистрированных посетителей Форма входа покупателей, показанная рис. 4-20, опре делена в файле (листинг 4-7).

Листинг 4-7 Вы найдете в файле на прилагае мом к книге компакт-диске.

Вы должны настроить свой сервер Web таким образом, чтобы при просмот ре виртуальных каталогов пользователю файл с именем Кроме того, следует запретить посетителям прямой просмотр содержимого вир туальных каталогов сервера Изучая листинг 4-6, Вы можете заметить, что в нем находятся две формы.

Первая форма входа зарегистрированных покупателей:

для

Она ссылается на страницу Вторая форма содержит кнопку с над писью Регистрация, щелкнув которую, посетитель попадает на реги Вначале мы рассмотрим исходный текст страницы enter.asp (листинг 4-8), Листинг 4-8 Вы найдете в файле на прилагаемом к книге компакт-диске.

При загрузке этой передается из формы содержимое полей с име нами и PWD (идентификатор посетителя и его пароль соответственно).

расположенный на странице enter.asp, получает иден тификатор пользователя и пароль, обращаясь к объекту а сохра няет соответствующие строки в переменных с именами и var var Далее сценарий создает объект Connection и открывает с источ ником данных, вызывая для этого метод Open:

connect;

connect = = 15;

= 10;

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

Мы методу Open в качестве параметров имя источника базы данных Интернет-магазина Bookstore, нами ранее, имя базы дан ных и пустую строку пароля. В реальном проекте мы рекомендуем определить отдельные учетные записи для работы с источником данных и пароли.

154 Базы в Интернете. Практическое руководство На следующем этапе сценарий создает объект Command, для выполнения процедуры аутентификации var = "ClientLogin";

= = connect;

процедура ClientLogin имеет два входных (идентифи катор и пароль посетителя) и один выходной (результат аутентификации).

параметры определяются в объекте Command следующим образом;

adVarChar, "Pass", adVarChar, adParamlnput, 50, Имена параметров указаны как и Pass. Это текстовые строки, тип параметров мы указываем как adVarChar. adParamlnput определяет, что параметры User и Pass являются входными. Длина текстовых строк, переда ваемых через данные параметры, не превышает 50 байт. И наконец, значения параметров берутся из sUser и sPassword.

Выходной параметр определяется аналогичным образом, но с применением константы ParamOut = adVarChar, 50, После формирования параметров они добавляются к команде метолом Append, чего команда при помощи метода Execute:

cmd.

Если в создания с источником данных, команды и ее параметров, а также при команды возникло ника ких ошибок, закрывается методом Close:

Строго говоря, можно не закрывать соединение подобным образом, так как после того как пользователь обратится к другой странице, оно будет автомати чески закрыто. Однако это может произойти не сразу 20 минут), поэтому для ресурсов сервера SQL Server мы закры ваем соединение явным образом.

Далее мы проверяем значение, полученное от хранимой процедуры Client Login через параметр ParamOut.

Если пользователя прошла успешно, в этом бу дет находиться значение, отличное от null. В этом случае мы сохраняем в менных сеанса результат аутентификации, признак успешной идентификации и идентификатор а затем передаем управление странице != null) Глава 4. Связь приложений с базами данных через ADO else { Переменная с Rights никак не нашим приложе нием, хотя Вы можете применить ее для дифференциации посетителей. В этом случае в таблице clients Вы можете предусмотреть поле Rights и в нем права устанавливая их в зависимости от тех или иных условий.

пользователи, сделавшие покупки на суммы, могут доступ к страницам Вашего магазина.

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

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

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

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

Исходный текст страницы error.asp показан в 4-9.

Листинг 4-9 Вы найдете в файле ch4\BookShopClient\error.asp на прилагаемом к книге компакт-диске.

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

в <р>0братитесь к администратору сервера Web.

На рис. 4-27 показано сообщение, появляющееся в том случае, если Вы пы таетесь создать соединение с несуществующим источником данных.

Базы данных в Интернете. Практическое руководство --.. ' Ошибка в к not found and no driver в] Done Рис. 4-27. Сообщение об ошибке при соединении с источником данных Другое сообщение появится в случае, если Вы назначить права до ступа к хранимой процедуре:

SQL Server permission denied on object database owner Кстати, если мы вовсе опустим обработку ошибок на странице enter.asp, то ошибка все равно будет обработана, но уже системой интерпретации страниц ASP. При этом в случае, например, прав на выполнение хранимой про цедуры в окне браузера посетителя появится показанное на рис. 4-28.

I..

MS] OLE for ODBC error SQL on owner Рис. 4-28. об ошибке, отображаемое ASP Хотя оно содержит даже больше нужно для отладки стра ницы (дополнительно отображается номер строки, в которой произошла ошиб ка), пользователю оно будет непонятно. Мы можем пользовате лю те или иные действия в зависимости от логики работы приложе ния или от того, где возникла ошибка, а также в ряде случаев полностью лик видировать ее последствия от пользователя.

Хранимая ClientLogin Теперь мы расскажем Вам о том. как устроена хранимая ClientLogin, которая вызывается из сценария cnter.asp и выполняет аутентифика цию пользователей посетителей магазина.

Глава 4. Связь с данных через ADO Исходный текст хранимой процедуры приведен в листинге 4-10.

Листинг 4-10 Вы найдете в файле на прилагаемом к книге компакт-диске.

Процедура ClientLogin имеет входных параметра и @Pass и один CREATE PROCEDURE ClientLogin output AS SELECT FROM clients WHERE AND clients SET WHERE С оператора SELECT процедура выбирает теля из столбца таблицы clients так, чтобы идентификатор, записанный в этом столбце, совпадал с содержимым параметра Кроме того, проверя ется совпадение пароля (хранящегося столбце Password) и содер жимого переменной Если в результате такого запроса в таблице clients найдена под ходящая запись, считается, что аутентификация прошла успешно. С помощью оператора UPDATE процедура ClientLogin поле LastLogin найденного пользователя, записывая в него дату и время подключения, полученные от фун кции GETDATE.

Определение фреймов главной страницы После успешной аутентификации страница enter.asp загружает в окно браузера посетителя страницу фреймов покупателя с именем Исходный текст этой подготовленной при помощи Microsoft FrontPage, Вы найдете в листинге Листинг 4-11 хранится в файле на прилагаемом к книге компакт-диске.

С помощью тегов и мы определили три фрейма с имена ми left, rtop и Для посещения нашего сервера нужен браузер, способный работать с Фрейм left загружается страницей содержащей команды покупателя — Выход и Оплатить покупки. Фрейм rtop используется для отобра списка книг, в и загружается страницей И наконец, фрейм rbottom используется для показа содержимого корзины с Базы данных в Интернете. Практическое отобранными посетителем для Он загружается страницей order.asp с параметром FIRST, (о этого параметра Вы позже при изучении исходного текста страницы order.asp).

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

Чтобы исключить возможность прямой загрузки страницы main.asp в обход страницы аутентификации покупателей, мы в исходный текст этой и других приложения файлы headcr.asp и footer.asp — при помощи оператора доступного в страницах ASP:

LANGUAGE = ffinclude -> тексты этих файлов приведены в (листинги 3- и 3-20), поэтому мы не будем здесь их что при любой страницы, в начало которой вставлен файл header.asp, проверка переменной сеанса с именем Ok. Если ция пользователя прошла сценарий файла header.asp вставляет в до кумент теги и а при — тег <МЕТА>, направ ляющий браузер на В результате все, что увидит попытавшийся загрузить в окно своего браузера страницу main.asp. это страница с предложе нием ввести идентификатор и пароль или регистрацию.

Страница меню команд В левом фрейме страницы приложения расположено команд, состоящее из двух ссылок — Выход и Оплатить покупки. Исходный текст дан ного фрейма Вы в Листинг 4-12 хранится в файле ch4\BookShopClient\toc.asp на прилагаемом к книге компакт-диске.

Ссылка Выход отправляет покупателя на страницу ввести идентификатор и зарегистрированного покупателя или выпол нить регистрацию нового покупателя.

<а Ссылка Оплатить покупки используется для загрузки страницы па которой реализуется процесс оплаты.

<а покупки Глава 4. Связь приложений с базами данных через ADO Страница просмотра списка книг На просмотра списка книг, в файле (лис тинг 4-13) посетитель может отобрать понравившиеся ему книги. Эта страница формируется из таблицы books, содержимое которой готовится сотрудниками Интернет-магазина с помощью административного приложения.

Листинг 4-13 хранится в файле на прилагае мом к книге компакт-диске.

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

connect = = 15;

= 10;

Теперь на возвращающую таблицы books. Вместо того чтобы создавать команду, опреде лять ее параметры и методом Execute, как это делалось раньше, мы другой метод для запуска хранимой процедуры.

Набор записей создается образом при помощи метода CreateObject объекта Server:

rs = Далее мы его открываем, методу Open объекта Recordset имя хранимой процедуры соединение с источником данных con nect и другие параметры:

connect, Константа adOpenForwardOnly, передаваемая методу Open в третьего параметра, определяет для открываемого набора записей тип курсора, наченного для просмотра записей только в одном (прямом) adLockReadOnl y сообщает ADO, что полученный набор записей изменяться не будет, поэтому его не нужно блокировать.

И наконец, константа adCmdStoredProc, передаваемая методу Open через следний параметр, указывает, что первый параметр метода задает имя хранимой процедуры, подлежащей выполнению.

После записей мы проверяем свойство EOF. Если оно хра нит True, это означает что полученный набор записей пуст. В этом слу чае вместо списка книг в верхнем правом фрейме появляется записей»:

В цикле мы последовательно строки набора записей, переме щаясь по ним при помощи метода определенного в объекте Recordset.

Условием завершения цикла является равенство свойства EOF значению Т в BORDER=1> while !

X> "Publisher"

:

} catch (ex) Для ссылки на поля набора записей используем соответствующих столбцов, из которых формируются строки набора. полей вставляется в ячейки формируемой таблицы с конструкций вида Для каждой книги мы вставляем в создаваемую таблицу ссылку на страни цу order.asp, которая добавить книгу в корзину поку пателя:

<а в Когда пользователь щелкнет ссылку, начнет загружаться страница order.asp.

При этом ей будут два параметра — идентификатор книги ID и флаг FIRST.

Параметр ID содержит по которому найти книгу в таблице books нашей базы данных. Без него мы бы не знали, какую нужно добавить в корзину. Что же касается флага FIRST, то его значение, равное О, свидетельствует, что страница order.asp загружается для добавления новой книги в список отобранных книг, а не для простого просмотра этого списка.

Глава Связь приложений с базами данных через ADO Когда обработка набора записей закончена, мы должны закрыть набор методом Close объекта Recordset:

Вслед за этим надо закрыть и соединение с источником данных, вызывая метод Close объекта Connection:

Исходный текст хранимой процедуры ListBooks, запускаемой выполнение серверным сценарием страницы в листинге 4-14.

4-14 Вы найдете в файле на прилагаемом к книге Эта процедура очень проста. С SELECT она выбирает не сколько из таблицы books:

CREATE PROCEDURE ListBooks AS SELECT Title, Publisher, Price, FROM books В результате ее работы создается набор записей, из которого формируется таблица со списком книг, имеющихся в продаже.

Добавление книги в корзину Для того чтобы добавить книгу свою покупатель щелкает ссылку Положить в корзину, расположенную в строке с названием этой книги. Об этой ссылке мы рассказывали в предыдущем разделе: она вызывает страницу order.asp с параметрами ID и FIRST.

На самом деле страница order.asp выполняет двойную функцию. Когда мы вызываем се с параметром равным 1, она просто отображает содержимое корзины покупателя. Если же значение равно 0, перед таким отображением происходит добавление выбранной книги в корзину.

В следующем разделе мы рассмотрим выполнение и той, и другой операции.

Страница просмотра содержимого корзины Особенностью страницы просмотра содержимого корзины является то, что она может одно или два обращения к базе данных в зависимости от зна параметра FIRST. Если этот параметр равен 0, сценарий вначале запуска ет хранимую процедуру добавляющую выбранную книгу к корзине, а затем процедуру ListOrders, для просмотра содержимого корзины.

Рассмотрим исходный текст order.asp, в листин ге 4-15.

Листинг 4-15 Вы найдете в файле ch4\BookShopClient\order.asp на прилагае к книге компакт-диске.

Для обработки возникающих при обращениях к базе данных, мы единый блок catch. Поэтому блок try также один.

Сразу после как страница получает сценарий получаст идентификатор пользователя и сохраняет его в локальной переменной с Базы данных в Интернете. Практическое руководство Этот для отбора тех в таблице orders, которые имеют отношение к данному покупателю.

Далее сценарий анализирует содержимое сеанса с именем FIRST.

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

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

Затем мы команду как объект Command и готовим для запуска хранимой процедуры AddToOrder. Этой процедуре нужно передать два входных параметра — идентификатор добавляемой книги booksID и идентифи катор покупателя ClientID, добавившего книгу. После этого запуска ется на выполнение методом Execute:

!= 1) var var connect;

cmd;

connect = = 15;

= 10;

cmd = = "AddToOrder";

= = connect;

50, "ClientID", adVarChar, 50, нам нужно отобразить в правом нижнем фрейме главного окна при ложения покупателя обновленное содержимое корзины. Чтобы не устанавливать повторное соединение с источником данных (оно уже установлено для запуска хранимой процедуры мы повторно анализируем параметр FIRST. Это позволяет время и ресурсы за счет исключения повтор ного соединения с источником данных:

== 1) { connect = 15;

= 10;

4. Связь приложений с базами данных через ADO В любом случае нужно подготовить хранимой процедуры ListOrders, возвращающую набор записей для книг, отобранных данным посе Эта только один параметр идентифи катор посетителя Запуск процедуры с помощью метода Execute:

= = "ListOrders";

= = connect;

rs;

rs=cmd.

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

На сценарий формирует в окне фрейма таблицу с ями Она создается в путем последова тельного просмотра записей rs MoveNext.

отобрали для

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

<а Удалить Здесь выполняется вызов страницы в качестве ра эта страница получает идентификатор удаляемой книги. Что же касается покупателя, то эту информацию delorder.asp «добы вает» самостоятельно из переменной сеанса с именем После завершения таблицы сценарий закрывает набор запи сей и ненужное больше с источником данных:

Базы данных в Интернете.

На странице order.asp две хранимые процедуры с именами AddTo Order и Расскажем о том, как они работают.

Исходный текст процедуры AddToOrder, для новых книг в корзину покупателя, показан в листинге 4-16.

Листинг 4-16 Вы найдете в файле на прилагаемом к книге компакт-диске.

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

Сначала процедура AddToOrder должна определить идентификатор записи в таблице clients, соответствующий идентификатору покупателя, передаваемому в процедуру через входной параметр Это задачу решает первый оператор SELECT. Найденный идентификатор со храняется в переменной тина INT и затем используется при добавле нии записей в таблицу orders:

CREATE PROCEDURE AddToOrder §booksID AS DECLARE INT SELECT FROM clients WHERE Второй оператор SELECT определяет стоимость выбранной книги по ее иден тификатору и записывает в переменную §bookPrice:

DECLARE MONEY SELECT FROM books WHERE booksID=@booksID Оператор INSERT добавляет в таблицу orders новую запись, заполняя поля идентификатора выбранной книги booksID, идентификатора покупателя ClientID, поместившего в корзину, и стоимости книги bookPrice:

INSERT orders (booksID, ClientID, bookPrice) Заметим, что стоимость книги легко получить по ее идентификатору из таб лицы поэтому нет никакой хранить ее в таблице orders.

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

Исходный текст хранимой процедуры Вы найдете в листинге Листинг 4-17 хранится в Файле на прилагаемом к книге компакт-диске.

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

Эта операция выполняется в два приема.

процедура ListOrders получает идентификатор записи обращаясь к содержимому Этот идентификатор сохраня ется в переменной CREATE ListOrders AS DECLARE INT Глава 4. Связь приложений с базами данных через ADO SELECT FROM clients WHERE Затем оператор SELECT, возвращающий информацию о заинтересовавших данного посетителя. Она получается с помощью объединения таблиц orders и books оператором JOIN:

SELECT FROM orders JOIN books ON WHERE Удаление книги из корзины Если посетитель покупать книгу, отобранную в корзину, он может удалить ее оттуда, щелкнув ссылку Удалить из корзины, расположенную рядом с книгой. При этом будет загружена страница delorder.asp 4-18).

Листинг 4-18 Вы найдете в файле на прилага емом к книге компакт-диске.

Первое действие, выполняемое сценарием сразу после загрузки страницы, — получение из переменной сеанса и сохране ние этого идентификатора в ClientID:

var Далее сценарий хранимую процедуру DelOrder, передавая ей два параметра:

connect = = 15;

= 10;

var = = "DelOrder";

= = connect;

50, adVarChar, adParamlnput, 50, Первый параметр с именем ClientID хранит только что упомянутый иденти фикатор посетителя, книгу из своей корзины. Второй параметр называется bookID и передается в страницу delorder.asp из страницы Он содержит идентификатор удаляемой книги.

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

Обратите внимание, что при загрузке страницы order.asp мы указываем па раметр FIRST, единице. Как Вы это значение Базы данных в Интернете. Практическое что нужно показать текущее содержимое корзины, не выполняя над ких операций.

Исходный текст хранимой процедуры представлен в листинге 4-19.

Листинг 4-19 находится в файле на прилагаемом к книге компакт-диске.

Процедура DelOrder выполняется в два На из таблицы clients идентификатор записи посетителя по его идентификатору, через CREATE PROCEDURE DelOrder AS INT SELECT FROM clients WHERE На втором этапе из таблицы orders удаляются все записи о книгах с иденти фикатором добавленные посетителем.

DELETE orders WHERE AND Административное приложение Теперь перейдем к описанию административного приложения, предназначенного для управления работой магазина. Это приложение позволит Вашим сотрудни кам редактировать список книг, имеющихся в продаже, формировать и ровать список персонала магазина и решать другие административные задачи.

Обычные посетители не должны иметь к этому приложению никакого доступа.

Прежде чем приступить к работе с административным приложением, Вам надо ввести и пароль на странице кации (рис. 4-29).

E Добро пожаловать!

Пароль Рис. 4-29. Вход в приложение При самом первом приложения база данных ад министраторов пуста, в нее автоматически добавляется введенный идентифика тор и пароль. Таким кто первый подключился к системе, тот и стал администратором.

После ввода пароля па появляется страница адми нистративного приложения, рис. 4-30.

Глава 4. Связь приложений с базами данных ADO - • а * Добро пожаловать, уважаемый LCI Рис. 4-30. Главная страница административного приложения В левом фрейме находится меню административных команд, а в правом — сообщение об успешном подключении и текущие права пользователя.

Первое, что должен сделать администратор, войдя в систему, — определить список управляющего персонала магазина. Для этого он должен ко манду Управляющий персонал. После этого в правом фрейме появится список персонала (рис. 4-31).

управляющего персонала finbv ил Done Рис. 4-31. Список администраторов После первого запуска в этом будет только одна запись — о первом подключившемся администраторе. Ссылка Новый позволит Вам до бавить другие записи. Когда Вы щелкнете ее в правом фрейме ся форма регистрации нового (рис. 4-32).

Здесь идентификатор и пароль сотрудника, а также его права (или, если хотите, функциональные обязанности).

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

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

Соответствующая форма показана на рис. 4-33.

7 Базы данных в Интернете. Практическое - Ex..

Новый Имя Права Рис. 4-32. Добавление записи о новом администраторе •а p.

Редактирование записи admin.

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

Ссылки Удалить в списке сотрудников предназначены для удаления учетных записей.

Если щелкнуть в левом фрейме ссылку Книги, на появится список книг, имеющихся в продаже 4-34).

этот список пуст. Чтобы в него название книги, щелкните ссылку Новая книга. На экране появится форма, предназначенная для добавления новой книги (рис.

Здесь указать автора книги, ее издательство, стоимость и текст аннотации. Для того чтобы добавить книгу в базу данных, следует щел кнуть кнопку В любой момент можно отредактировать описание книги, хранящееся в базе данных магазина. Для этого в списке книг щелкнуть ссылку нить. В правый фрейм будет загружена с формой для редактирования сведений о книге (рис. 4-36).

Глава 4. Связь приложений с базами данных через ADO ч* Список Г.В. Фролов данных Русская редакция Дата 12. практическое по с базами данных а корпоративной рассмотрены с Рус книга ASP Рис. 4-34. Просмотр списка книг, имеющихся в продаже - provided.

к Автор Скотт Active у е.

.

| Рис. 4-35. Добавление в список названия книги Базы данных в Интернете. Практическое руководство о - provided ИМ У сведений о Актер приложений с и руководство Русская Эта книга собой по с а также для Б ней созданные работы с Рис. 4-36. Редактирование сведений о книге Чтобы обновить содержимое базы данных после редактирования полей этой щелкните кнопку Сохранить изменения.

И наконец, чтобы удалить книгу из базы данных, достаточно щелкнуть ссыл ку Удалить напротив названия книги в списке просмотра, рис. 4-34.

Команда Покупатели, расположенная в левом фрейме страницы админист ративного приложения, открывает доступ для просмотра таблицы посетителей client и некоторых полей. Если щелкнуть эту ссылку, на эк ране появится форма, позволяющая задать критерии поиска клиентов (рис. 4-37).

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

Если оставить поля идентификатора пользователя и электронного адреса незаполненными, щелчок ссылки Поиск приведет к появлению в правом фрей ме списка всех покупателей, в указанный времени, кроме того, снять с искать по дате будет составлен список всех Так как поиск записей посетителей выполняется с оператора LIKE, в полях Идентификатор покупателя и Адрес E-Mail можно использовать символы шаблонов, стандартные для языка На рис. 4-38 показан полный список зарегистрированных покупателей, полу ченный с помощью только что описанной формы поиска.

Командой Изменить Вы можете отредактировать некоторые параметры ре гистрации пользователя (рис. 4-39).

Глава 4. Связь приложений с данных через ADO - provided routes s Просмотр Адрес Начальная дата Конечная дата ' 6 7 i 13 Я 2В 31 21 24 Ноябрь I? 20 22 ' а Рис. 4-37. Форма для поиска зарегистрированных покупателей D ' asp в % " Апекса ftolovTgglastiel...

p s РИД op о op s 11-45- 0 ~ t Рис. 4-38. Полный список зарегистрированных покупателей Базы данных в Интернете. руководство •.

учетной посетителя Деньги "О" И 45: при Адрес Обновить Рис, 4-39. Редактирование параметров регистрации покупателя Для сокращения объемов листингов мы отображаем здесь не все параметры регистрации. При создании реального проекта Вы, однако, можете расширить набор параметров, в него все остальные поля таблицы clients.

Команда Корзина позволяет сотруднику магазина просмотреть содержимое корзины выбранного пользователя (рис. 4-40).

Содержимое покупателя frolov Фролов. с для редакция Скотт Active Русская Рис. 4-40. Просмотр содержимого корзины покупателя Здесь мы не предусмотрели возможность удаления книг из корзины, так как считаем, что это должен делать сам покупатель. Что касается очистки кор зин покупателей от старых записей, то для выполнения этой работы стоит пре дусмотреть отдельную команду в приложении.

Вернемся к списку покупателей.

Глава 4. Связь приложений с базами данных через ADO Ссылка Удалить позволит сотруднику магазина удалить регистрационную запись выбранного покупателя. Однако такую операцию надо выполнять осто рожно. Например, если покупатель отобрал товар в корзину или уже делал по купки в Вашем магазине, его, не следует удалять.

Если щелкнуть ссылку Удалить, на экране появится временная модальная диалоговая панель с (рис. 4-41).

Рис. Диалоговая панель с предупреждением Вы можете в панели отказаться от удаления, щелкнув ссылку Отменить, или подтвердить свои намерения при помощи ссылки Удалить.

Если корзина удаляемого покупателя пуста, операция будет выполнена ус пешно. Это подтвердит сообщение, показанное на рис. 4-42.

Учетная запись успешно Рис. 4-42. Сообщение об успешном удалении учетной записи покупателя Если же покупатель отобрал книги в корзину, наше административное при ложение откажется удалять его учетную запись, о чем и сообщит администра тору (рис. 4-43).

учетную запись:

ЭК Рис. 4-43. Сообщение о невозможности удалении учетной записи активного Файл global.asa В корне виртуального каталога нами для страниц адми приложения, необходимо поместить файл Вы можете использовать здесь тот же самый файл, что и для приложения Его исходный текст мы уже приводили в листинге Страницы входа Рассмотрим исходные тексты страниц, предназначенные для входа сотрудников Вашего Интернет-магазина в административное приложение.

Базы данных в Интернете. Практическое Страница (листинг 4-20) должна в окно браузера по умолчанию, когда сотрудник пытается просмотреть содержимое вир туального каталога административного приложения.

Листинг хранится в файле на прилагаемом к книге компакт-диске.

В форме, на той странице, необходимо ввести идентифика тор и пароль, а затем щелкнуть кнопку Вход:

<Н1>Добро

SIZE= В отличие от страницы начального входа посетителей здесь нет кнопки ре Как мы уже говорили, первый, кто к административ ному приложению, автоматически регистрируется в нем с полными правами. Б он сам будет пополнять список После щелчка кнопки Вход передается странице Enter.asp, вы полняющей аутентификацию (листинг 4-21).

Листинг 4-21 Вы найдете в файле на прилагаемом к книге компакт-диске.

В целом она напоминает аналогичную страницу аутентификации приложе ния покупателя, однако есть и отличия.

Серверный сценарий получает идентификатор пользователя и пароль из по лей формы с именами USR и записывая их в и соответственно:

var Вначале серверный сценарий устанавливает соединение с источником данных:

connect;

connect = = 15;

= 10;

Далее для аутентификации вызывается хранимая процедура работающая с таблицей managers:

= = "ManagerLogin";

= adCmdStoredProc;

= connect;

Глава 4. Связь приложений с базами через ADO CreateParameter( "User", 50, "Pass", adVarChar, adParamlnput, = "Rights", adVarChar, 16, После выполнения этой процедуры результат аутентификации сохраняется в переменной ParamOut, а права сотрудника, к при ложению, — в переменной сеанса Rights. выполняется загрузка главной страницы административного :

Если аутентификация закончилась с ошибкой, в окне приложения появляет ся Доступ запрещен, оформленное в виде ссылки на страницу аутен тификации else flights" страница Главная административного приложения содержит определение двух фреймов (листинг 4-22).

Листинг Вы найдете в файле ch4\BookShop\main.asp на прилагаемом к книге компакт-диске.

В левом фрейме toc.asp находятся команды в виде ссылок на другие страни цы, а в правом (с именем main) отображается результаты выполнения этих (см. стр.) Базы данных в руководство этой страницы нужен браузер, способный фреймами.

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

Страница меню команд Исходный текст страницы команд представлен в листинге 4-23.

Листинг 4-23 Вы найдете в файле на прилагаемом к кни ге Для загрузки ASP, выполняющих команды, мы применили здесь функцию клиентского сценария to, составленную на языке JavaScript:

LANGUAGE=JavaScript> function to(url) { toSt } Ее единственной задачей является отключение страниц брау зером, что достигается добавлением к адресу загружаемой страницы фик тивного параметра в виде случайного числа. Этот механизм кэши рования мы рассматривали во второй главе нашей книги.

Для просмотра и редактирования списка управляющего персонала страница toc.asp загружает Редактирование списка книг, имеющих ся в продаже, выполняет страница а работу со покупателей — страница <а персонал<Ьг> <а <а Страница с сообщением о подключении При первой загрузке главной страницы административного приложения в окно правого фрейма загружается страница показанная в листинге 4-24.

Листинг 4-24 хранится в файле ch4\BookShop\hello.asp на прилагаемом к кни ге Глава 4. с базами данных через ADO В ней содержится приветственное сообщение, включающее идентификатор сотрудника, работающего с приложением, и его права. Эта информация, опре деляемая при аутентификации, извлекается из переменных сеанса с именами и Rights var "Administrator") else == по продажам";

== складом";

else пожаловать, уважаемый <р>Вы подключились к системе как Страницы управления персоналом Страницы управления персоналом, расположенные в файле позво ляют администратору магазина управлять учетными сотрудников. Эта страница используется совместно с тремя другими — и edtmanager.asp, которые отвечают соответственно за создание, удаление и ре дактирование учетных записей.

Просмотр списка сотрудников Просмотр списка сотрудников на странице Исходный текст этой страницы Вы найдете в листинге 4-25.

Листинг хранится в файле на прилагаемом к книге компакт-диске, В начале своей работы сценарий, расположенный на странице запускает хранимую процедуру var connect;

var rs;

connect = = 15;

= 10;

= connect, adLockReadOnly, Эта процедура не имеет никаких параметров, а в результате своей работы возвращает содержимое полей Name, Ri ght s и LastLogi n всех записей файла managers. Эти поля сохраняются в наборе записей rs.

Далее сценарий наличие записей и, если файл managers не пуст, создает на их основе таблицу. Для этого в организован цикл:

Базы данных в Интернете. Практическое руководство последнего

' В строку создаваемой таблицы записывается идентификатор сотруд ника, используемый им для подключения, его права, время последнего подклю чения, а также две команды — и Удалить.

учетной записи выполняется на странице edtma nager.asp, а удаление — на странице delmanager.asp. И та, и другая страница по Глава 4. Связь приложений с базами данных через ADO в качестве параметра пользователя из поля Name текущей строки обрабатываемого набора записей rs.

В последнюю строку таблицы вставляет ссылку Новый сотрудник, отправляющую администратора на страницу Там он сможет создать запись для нового сотрудника:

Листинг 4-26 Вы найдете в файле ch4\BookShopScripts\dbo.ListManagers.PRC на прилагаемом к книге компакт-диске.

Эта процедура получает содержимое полей Rights и LastLogin таблицы managers при помощи оператора SELECT и имеет никаких особен ностей:

CREATE PROCEDURE ListManagers AS SELECT Name, Rights, LastLogin FROM managers Создание записи Для создания новой учетной записи сотрудника магазина вызывается страница newmgr.asp, исходный текст которой приведен в листинге 4-27.

Листинг 4-27 Вы найдете в файле ch4\BookShop\newmgr.asp на прилагаемом к книге компакт-диске.

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

else var while EOF) != null).

== "Administrator") else == по продажам";

else == складом";

else

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

Щелчок кнопки Создать отправляет данные, в полях фор мы, на страницу createmgr.asp (листинг 4-28). Расположенный там серверный 180 Базы данных в Интернете. Практическое сценарий добавляет параметры нового сотрудника в таблицу managers базы дан ных магазина.

Листинг 4-28 хранится в файле на прилагаемом к книге Добавление новых сотрудников разрешено только администраторам, поэто му в начале своей работы сценарий страницы createmgr.asp проверяет права пользователя, записанные в переменную с именем Rights при аутентифи Если это администратор, сценарий продолжает свою работу, а если нет, — выводит сообщение о том, что прав недостаточно:

{ connect = 15;

= 10;

var cmd = = "NewMgr";

= = connect;

"User", adVarChar, 50, adVarChar, adParamlnput, 50, ramete "Rights", adVarChar, adParamlnput, 16, cmd.

:

else < !

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

По завершении своей работы сценарий страницы createmgr.asp снова загру жает в правый главной страницы административного доку мент Теперь в нем появится новая только что добавленная запись.

Исходный текст хранимой процедуры NewMgr Вы найдете в листинге 4-29.

Листинг 4-29 находится в файле на при лагаемом к книге компакт-диске.

Глава 4. Связь приложений с базами данных через ADO Оиа просто вставляет параметры и в поля таблицы managers:

CREATE PROCEDURE @Pass AS INSERT managers (Name, Password, Rights, @Pass, NULL) Что же касается поля LastLogin, хранящего дату последнего подключения сотрудника к системе, то в нее записывается NULL. Мы это делаем по что только что зарегистрированный сотрудник еще ни разу не входил в систему Удаление учетной записи сотрудника Эта операция выполняется на странице (листинг 4-30).

Листинг 4-30 Вы найдете в файле ch4\ на прилагае мом к книге После проверки прав пользователя серверный сценарий, располо женный на этой странице, получает со страницы идентификатор удаляемой записи через параметр ID и запускает хранимую процедуру rs, connect;

( connect = = 15;

= 10;

var = = "DelMgr";

= = connect;

cmd.

"User", adVarChar, 50, catch (ex) !

} else Response. asp?

Базы данных в Интернете. Практическое руководство DelMgr (листинг 4-31) этот идентификатор передается через пара метр с именем User.

Листинг 4-31 Вы найдете в файле на при к книге компакт-диске.

В случае успешного завершения в правый фрейм главного окна администра тивного приложения загружается страница Хранимая процедура DelMgr удаляет из файла запись сотрудника, идентификатор которого равен идентификатору, полученному процедурой через параметр PROCEDURE DelMgr AS DELETE managers WHERE Редактирование записи Редактирование записи выполняется на странице edtmanager.asp (листинг 4-32).

Листинг 4-32 хранится в файле ch4\ на прилагаемом к книге компакт-диске.

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

Если с правами все в начинает хранимая процедура извлекающая текущие параметры учетной записи выбранного сотрудни ка. Она имеет один входной параметр User (идентификатор сотрудника) и два выходных — (пароль) и Rights (права сотрудника):

connect = = 15;

= 10;

var cmd = = "GetMgr";

= = connect;

"User", adVarChar, 50, var "Pwd", adVarChar, adParamOutput, 50, var "Rights", adVarChar, adParamOutput, 16, connect.

Глава 4. Связь приложений с базами данных через ADO Значения, из таблицы managers, в форму редак тирования, в которой администратор может их изменить:

<Н2>Редактирование записи пользователя

После изменения передается странице сценария 4-33), обновление записи в фай managers.

Запуская страницу updatemgr.asp, наш сценарий передает ID (идентификатор записи сотрудника), USR (идентификатор (па роль) и RG (права сотрудника), причем параметр ID передается через скрытое поле формы.

Листинг 4-33 Вы найдете в файле ch4\ на прилагае мом к книге компакт-диске.

Задача сценария, расположенного на странице updatemgr.asp, в запуске хранимой процедуры обновление файла Данные для обновления она получает через свои параметры г, и connect = = 15;

= 10;

= (см. стр.) 184 Базы данных 8 Интернете. Практическое = = = connect;

"User", 50, adVarChar, adParamlnput, 50, var adVarChar, adParamlnput, 50, var "Rights", adVarChar, adParamlnput, 16, С Us cmd.

Исходный текст SetMgr находится в листинге 4-34.

Листинг 4-34 хранится в файле на прила гаемом к книге компакт-диске.

Она поля записи файла managers, вводя значения, полученные через параметры:

CREATE PROCEDURE SetMgr,, varchar(16) AS UPDATE managers SET FROM managers WHERE Описанную схему редактирования записей таблицы managers Вы можете для создания редакторов любых других таблиц, как отдельных, так и связанных между собой.

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

Эти задачи решаются с помощью серверных сценариев books.asp, и Просмотр списка книг Для просмотра списка книг используется страница books.asp, исходный текст которой в листинге 4-35.

Листинг 4-35 Вы найдете в файле ch4\ BookShop\books.asp на прилагаемом к книге компакт-диске.

Для получения списка всех книг сценарий вызывает хранимую процедуру Глава 4. Связь приложений с базами данных через ADO connect;

var rs;

connect = = 15;

= 10;

= Если список пуст, вместо таблицы со списком книг отображается строка «Нет В противном случае сценарий формирует таблицу с описанием книг, обрабатывая в цикле набор записей rs, полученный в результате работы проце дуры

else BORDER=1> var while "Author" "Title" "Publisher" y.e.

обновления:

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

Что же касается хранимой процедуры (листинг 4-36), то ее задача — выбор полей Author, Title, Publisher, Price, и Annotati on из таблицы books.

Листинг 4-36 Вы найдете в файле на прилагаемом к книге компакт-диске.

Эта задача с помощью простого оператора SELECT:

CREATE PROCEDURE ListBooks AS SELECT Title, Publisher, Price, books новой книги Как мы только что сказали, после щелчка ссылки Новая книга управление пе редается странице newbook.asp (листинг 4-37).

Листинг 4-37 хранится в файле ch4\ BookShop\newbook.asp на прилагаемом к книге компакт-диске.

Она содержит форму с полями описания книги:

Глава 4. приложений с базами данных через ADO
После заполнения всех полей формы сотрудник магазина должен щелкнуть кнопку Добавить, тогда данные из полей формы будут переданы сценарию 4-38).

Листинг 4-38 хранится в файле ch4\ на прилагаемом к книге компакт-диске.

Задачей этого сценария является получение указанных выше данных через параметры Author, Title, Publisher, Price и Annotation с записью в books.

Запись о новой книге выполняется хранимой процедурой с применением уже знакомой Вам техники:

connect = = 15;

= 10;

var = = "NewBook";

= = connect;

"Author", 50, "Title", adVarChar, adParamlnput, 200, adVarChar, adParamlnput, 50, "Price", adParamlnput, "Annotation", adVarChar, adParamlnput, 2048, cmd.

текст хранимой процедуры NewBook приведен в листинге 4-39.

Листинг 4-39 Вы найдете в файле на прилагаемом к книге компакт-диске.

Хранимая процедура NewBook имеет одну особенность она записывает ан нотацию к книге в поле Annotation, размером 2 048 байт;

Базы данных в Интернете. Практическое CREATE PROCEDURE money, AS INSERT books (Author, Title, Publisher, Price, Annotation) Такой размер поля только таблицах SQL Server версии 7.0. Что же версии 6.5, то для нее эта величина ограничена значением 255 байт, поэтому хранение больших объемов текста нужно выполнять по-другому (на с полей типа text).

Удаление книги Если сотрудник захочет удалить книгу из базы данных и щелкнет ссылку Удалить в списке книг, получит страница (ли стинг 4-40).

Листинг 4-40 вы найдете в файле ch4\ на прилагаемом к книге компакт-диске.

Данная страница запускает хранимую процедуру DelBook, передавая ей в ка честве единственного параметра идентификатор удаляемой книги bookID:

connect = = 15;

= 10;

var = = "DelBook";

= = connect;

"bookID", adVarChar, 50, cmd.

Этот идентификатор извлекается из параметра запуска страницы с именем ID.

Исходный текст хранимой процедуры DelBook Вы найдете в листинге Листинг 4-41 находится в файле на при лагаемом к книге компакт-диске.

Эта процедура удаляет из файла books записи с идентификатором, ным ей через параметр ibookID:

CREATE DelBook AS DELETE books WHERE Редактирование описания книги Процесс редактирования описания книги состоит из двух этапов. На первом мы получаем сведения о книге из таблицы books и их в поля формы для редактирования, а на втором отредактированное описание книги помещаем об ратно в таблицу books.

Первый этап выполняется при помощи сценария editbook.asp 4-42).

Листинг 4-42 Вы найдете в ch4\ на прилагаемом к книге компакт-диске.

Глава 4. Связь приложений с базами данных через ADO После проверки прав пользователя сценарий запускает хранимую процеду ру GetBook, определяя для нее один входной и несколько выходных параметров:

var rs, connect;

connect = = 15;

= 10;

= = = adCmdStoredProc;

= connect;

50, "Author", adVarChar, 50, "Title", adParamOutput, 200, adVarChar, adParamOutput, 50, var Price=0;

8, var AddDate=cmd.CreateParameter( adVarChar, adParamOutput, 50, var adVarChar, 2048, С cmd.

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

(см. стр.) Базы данных в Интернете. Практическое руководство
После щелчка кнопки Сохранить изменения данные из этой формы переда ются странице которую мы рассмотрим чуть позже.

Сведения о книге из базы данных при помощи хранимой про цедуры GetBook (листинг 4-43).

Листинг 4-43 Вы найдете в файле на прилагаемом к книге компакт-диске.

Эта процедура принимает в качестве входного параметра идентификатор книги возвращая информацию о ней через выходные параметры:

CREATE PROCEDURE GetBook output, output, output, money output, Глава 4. Связь с базами через ADO output, output AS SELECT @Publisher=Publisher, FROM books WHERE Обновление отредактированного описания книги в таблице books выполня ется серверным сценарием, расположенным на странице (лис тинг 4-44).

Листинг 4-44 Вы найдете в файле ch4\ на прилагае мом к книге компакт-диске.

Эта страница вызывает хранимую процедуру SetBook, обновляющую поля таблицы books:

connect = = 15;

= 10;

var = = "SetBook";

= connect;

50, var adVarChar, 50, var adVarChar, adParamlnput, 200, var "Publisher", adVarChar, adParamlnput, 50, var "Price", adParamlnput, 50, adVarChar, 2048, Request ramete cmd.

Базы данных в Интернете. Практическое руководство Исходный текст процедуры приведен в листинге 4-45.

Листинг 4-45 Вы найдете в файле ch4\BookShopScripts\dbo.SetBook.PRC на прилагаемом к книге компакт-диске.

Процедура выполняет обновление полей таблицы books значениями, передан ными ей через параметры:

CREATE PROCEDURE varchar(50), varchar(50), varchar(2048) AS UPDATE books SET FROM books WHERE bOOksID=§boOkID Работа с записями покупателей В функции администратора Интернет-магазина входит просмотр списка зареги стрированных просмотр содержимого их корзин и удаление учет ных записей неактивных покупателей — с помощью административного прило жения.

Форма поиска покупателей Так как в популярном магазине регистрируется множество, едва ли имеет смысл выводить их полный список для просмотра или редактирования отдельных учетных записей. Вместо этого мы разработали поисковую систему, которая позволит сотруднику магазина находить учетные записи пользователей по их именам, адресам электронной почты или датам регистрации. Дополнитель но мы предусмотрели при поиске символов шаблонов, необходи мых для того, чтобы найти пользователей по неточным или неполным именам или по адресам электронной почты.

Исходный текст страницы Cu.stomerSearch.asp, предназначенной для задания параметров поиска, представлен в листинге 4-46.

Листинг 4-46 Вы найдете в файле на при лагаемом к книге компакт-диске.

Обратите внимание на то, что в этой странице мы используем и клиентские, и серверные сценарии. Для выбора по дате регист рации мы включили в исходный текст страницы файл описанный во второй главе. С средств Dynamic HTML этот файл создает на страни це два календаря, предназначенных для указания начальной и конечной даты регистрации.

Сразу после загрузки страницы, однако, в дело включается серверный сце нарий. содержимое переменной сеанса сервер ный выбирает для одну из двух функций клиентского сценария: или == null) { Глава 4. Связь приложений с базами данных через ADO else == ?

== ?

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

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

На странице находится также клиентского сце нария с именем до:

function !

var var } else { (см. стр.) Базы данных в Интернете. руководство Ей передается управление, когда пользователь щелкает ссылку Поиск для по списка записей посетителей. Функция до из полей формы данные, необходимые для поиска учетной записи, и их странице, выполняющей запрос к базе данных.

Обратите как функция до кодирование шаблона име ни и адреса электронной вызывая встроенную функцию JavaScript с именем escape:

var Такая кодировка необходима, чтобы параметры с символами кириллицы и другими символами, такими, как символы пунктуации, правильно вызываемой странице ASP.

Для загрузки в правый фрейм страницы GetSearchResults.asp, поиск регистрационных записей в базе данных, до использует свойство браузера href. Обратите на фиктивный параметр для отключения методом генерации случайно го адреса О работе функции клиентского сценария мы уже рассказыва ли во второй главе. Она для удаления календарей из страницы при снятии отметки с искать по дате Просмотр списка зарегистрированных Рассмотрим исходный текст страницы GetSearchResults.asp, по иск учетных записей посетителей магазина в базе данных. Вы найдете его в ли стинге 4-47.

Листинг 4-47 хранится в файле ch4\ на прила гаемом к книге компакт-диске.

Так же как и только что рассмотренная страница ца GetSearchResults.asp использует одновременно клиентские и серверные сце нарии. В частности, функция клиентского сценария trydeluser применяется при удалении ненужной учетной записи неактивного посетителя:

Когда страница GetSearchResults.asp получает управление в первый раз, рас положенный на ней серверный сценарий записывает в сеанса с именем строку «used»;

Далее сценарий вызывает хранимую процедуру список учетных записей посетителей:

connect = = 15;

= 10;

= = "SearchUsers";

- 4;

= connect;

var dTo, dEMail, dDateCheck;

// После обновления записи == "restart") • // После страницы поиска else 2) (см. стр.) Базы данных в Интернете. Практическое 2);

2);

4);

2);

== == !

200, 1, 13, 200, 200, 20, 200, 200, 20, rs = cmd.

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

Далее параметры поиска передаются хранимой процедуре SearchUsers, выпол няющей запрос к базе данных. Результаты этого запроса в виде набора записей На следующем этапе серверный сценарий страницы формирует документ HTML, записывая в него параметры поиска и таблицу с найденными учетными записями. При этом в локальной переменной Глава 4. Связь приложений с базами данных через ADO подсчитывается общее количество найденных покупателей, а в переменной выполняется подсчет общего количества денег, полученных от них:

== в период от до else < в любое != ? :

!= ? dEMail :

<ТН>Дата <Х var var nCounter=0;

(см. стр.) 198 Базы данных в Практическое <тп>

Для работы с дробными значениями денежных сумм мы вначале умножаем на 100 полученную от каждого покупателя, а затем на 100 общую сумму.

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

Рассмотрим исходный текст процедуры (листинг 4-48).

Листинг 4-48 Вы найдете в файле на прилагаемом к книге компакт-диске.

Она выполняет поиск записей в таблице clients в со ответствии с указанными параметрами.

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

Если же это не так, то для удовлетворения условиям поиска дата регистрации должна находится в пределах, заданных параметрами и CREATE PROCEDURE SearchUsers datetime varchar(80), AS IF IS NULL BEGIN SELECT SELECT -7, END Для отбора данных по имени пользователя и его адресу электронной почты мы применили оператор LIKE, допускающий применение символов шаблона:

SELECT ClientID, Password, Language, Status, spam, RegisterDate, clients WHERE OR AND AND LIKE Глава 4. Связь приложений с базами данных через ADO AND Email LIKE Удаление записи покупателя Как уже говорилось для удаления учетной записи покупателя мы вызы ваем функцию клиентского сценария с именем передавая ей в каче стве параметров идентификатор пользователя и его имя.

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

Для отображения предупреждающего сообщения об удалении учетной записи посетителя эта отображает на экране модельную диалоговую trydeleteuserdlg.asp (листинг 4-49), вызывая ее при помощи функции клиент ского сценария При этом функция trydeluser передает странице массив параметров с идентификатором пользователя и его именем, используемым для входа в магазин.

Листинг 4-49 Вы найдете в файле ch4\ на при лагаемом к книге компакт-диске.

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

<р>Учетная удалена!

Если пользователь решит продолжить удаление и щелкнет ссылку Удалить, управление получит функция клиентского сценария tryDeleteAcc, определенная на странице trydeleteuserdlg.asp. При отказе от удаления с помощью ссылки Отменить будет вызвана функция клиентского сценария cancelDeleteAcc:

<а <а Функция завершает работу диалоговой панели, воз вращая значение true:

function Функция cancelDeleteAcc сообщает об отмене удаления зна чения false:

200 Базы данных в Интернете.

function !

• Теперь мы снова вернемся к функции Если сотрудник магазина решил продолжить удаление учетной записи, эта функция создает еще одну модальную диалоговую панель, загружая в нее стра ницу var + if(rVal==false) return;

Страница trydeleteacc.asp пытается удалить учетную запись посетителя из базы данных. Если это ей удается, мы удаляем средствами DHTML строку с этой записью из общего списка:

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

Рассмотрим исходный текст страницы trydeleteacc.asp со сценарием, выпол няющим попытку удаления учетной данных (листинг 4-50).

Листинг 4-50 Вы найдете в файле на прилагае мом к книге компакт-диске.

Получив управление, сценарий проверяет текущие права сотрудника, разре шая удалять учетные записи посетителей только администраторам. Далее вызы вается хранимая процедура выполняющая попытку удаления. Ей передается один входной параметр ID (идентификатор пользователя) и один выходной — о результате выполнения операции удаления (для примера мы в этом и некоторых других сценариях передаем методу Append числовые, а не символьные значения):

connect = = 15;

= 10;

var = = "DeleteUser";

= 4;

= connect;

Глава 4. Связь приложений с базами данных через ADO ramete reatePa 3, 1, 4, 3, 3, После выполнения хранимой процедуры серверный сценарий анализирует содержимое выходного параметра и формирует соответству ющее сообщение. Кроме того, в зависимости от результата операции создается один из двух вариантов функции клиентского сценария закры вающей окно модальной диалоговой панели. Если удаление прошло успешно, эта функция возвращает значение а если нет — false:

DelOk = if(DelOk == 0) ;

x>

Исходный текст хранимой процедуры DeleteUser приводится в листинге 4-51.

Листинг 4-51 Вы найдете в файле на прилагаемом к книге компакт-диске.

В этой процедуре мы создаем локальную присваивая ей нулевое значение. Если данный посетитель имеет записи в orders (то есть если он отобрал книги для мы считаем его активным и устанав ливаем содержимое переменной равное единице:

CREATE PROCEDURE DeleteUser int, int =0 output AS DECLARE SELECT IF EXISTS(SELECT * FROM orders WHERE SELECT Для пассивных посетителей выполняется регистрационных запи сей из таблицы clients:

IF BEGIN DELETE clients WHERE END Результат выполнения операции удаления в любом случае записывается в выходной параметр SELECT Глава 4. Связь приложений с базами данных через ADO Просмотр содержимого корзины покупателя Сотрудник магазина просмотреть содержимое покупателей при помощи order.asp (листинг 4-52). Эта страница почти так же, как и страница корзины в приложении покупателя, однако в ней не предусмотрено изменение содержимого корзины.

Листинг 4-52 Вы найдете в файле ch4\BookShop\order.asp на прилагаемом к книге компакт-диске.

Серверный сценарий, расположенный на этой странице, вызывает хранимую процедуру — ее мы уже описывали ранее в разделах, посвященных покупателя:

= - 15;

= 10;

= = "ListOrders";

= = connect;

adVarChar, 50, ClientID));

var rs;

Идентификатор покупателя (корзину которого мы будем просматривать) сценарием из параметра ID и затем передается хранимой процеду ре с использованием локальной переменной ClientID.

Далее сценарий формирует таблицу, содержащую список книг, отобранных покупателем:

корзины покупателя BORDER=1> while "Publisher" !

204 Базы данных в Интернете. Практическое руководство Редактирование регистрационных данных покупателя Эта операция выполняется в два приема. Вначале загружается страница текст которой представлен в листинге 4-53. Она получает сведения о регистрационной покупателя из базы данных магазина и ото бражает их в форме. Затем данные формы попадают на страницу User.asp, обновляющую запись в базе данных.

Листинг 4-53 Вы найдете в файле на прилагаемом к книге компакт-диске.

В начале своей работы страница проверяет права пользователя, разрешая редактирование регистрационных записей только администраторам. Затем запуск хранимой процедуры Get User, извлекающей регистрационную запись из базы данных. В качестве вход ного параметра мы передаем этой идентификатор connect = = 15;

= 10;

var = = = 4;

= connect;

var ID = "ID", 4, var = 50, var Pass = С var Language = adVarChar, adParamOutput, 50, var adParamOutput, ramete var RegisterDate = adParamOutput, 8, var RegisterIP = adVarChar, adParamOutput, 15, Глава 4. Связь приложений с базами данных через ADO var Email = "Email", 80, Обратите внимание, как мы параметры хранимой процеду ры, имеющие отношение к данным типов.

Для целых чисел мы указываем константу текстовые строки пере даются с константы adVarChar, а для передачи денежных дан ных применяется константа И наконец, отметка о времени переда ется с использованием константы Значения, полученные от хранимой процедуры, нужны для инициализации полей формы, предназначенной для редактирования учетной записи посетите ля:

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

Исходный текст хранимой процедуры представлен в листинге 4-54.

Листинг 4-54 Вы найдете в файле на прилагаемом к книге компакт-диске.

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

CREATE PROCEDURE GetUser int, output, output, varchar(50) output, output, varchar(15) varchar(80) output AS SELECT SELECT clients WHERE Исходный текст страницы Update User.asp, выполняющей обновление записи показан в листинге 4-55.

Листинг 4-55 Вы найдете в файле на прилагае мом к книге компакт-диске.

LANGUAGE = flinclude -> -> В своей работы серверный сценарий, расположенный на этой страни проверяет пользователя. Мы разрешаем изменять учетные записи по купателей только администраторам.

Далее сценарий вызывает процедуру передавая ей входные идентификатор пользователя и обновленное содержи мое полей учетной var rs, connect;

connect = = 15;

= 10;

cmd = = "SetUserData";

= 4;

= connect;

Глава 4. Связь приложений с базами данных через ADO 3, 1, 4, var "Name", 200, 1, 20, "Pass", 200, 1, 20, "Email", 200, 1, 80, После обновления записи мы попадаем на страницу GetSearch которая теперь вызывается с параметром MODE, имеющим значение restart:

текст хранимой процедуры SetUse rOata в листинге 4-56.

Листинг 4-56 Вы найдете в файле ch4\BookShopScripts\dbo.SetUserData.PRC на прилагаемом к книге компакт-диске.

Она обновляет поля таблицы clients полученными через свои параметры:

CREATE PROCEDURE int, AS UPDATE clients SET WHERE Работа с ADO в приложениях C++ Объектная модель ADO создавалась для применения с различными языками и системами программирования, совместимыми с СОМ. В предыдущих разделах главы мы основные приемы и мето дов ADO в серверных сценариях ASP, написанных на языке Microsoft JScript.

Вместе с тем модель ADO также доступна в серверных сценариях Script, в программах Java, Microsoft Visual Basic и в приложениях, подготовленных при помощи Microsoft C++.

Такие языки программирования, как Microsoft JScript, VB Script и Microsoft Visual Basic, в значительной «маскируют» тот факт, что работа с ADO выполняется средствами СОМ. Это позволяет составлять доста точно сложные программы, обращающиеся к базам данных, не затрудняя себя детальным изучением модели компонентных объектов СОМ. В случае исполь зования требуются более глубокие знания, хотя и здесь есть возможности для упрощения разработки приложений, интенсивно взаимодействующих с 208 Базы данных в Интернете.

Для чего Вам могут потребоваться приложения C++, обращающиеся к базам данных посредством ADO?

Если речь идет о приложениях для Интернета, то это нужно, прежде всего, для связи программных расширений сервера Web, таких, как программы CGI или ISAPI, с базами данных. Кроме того, иногда надо расширить объектную модель ASP, добавив собственные элементы ActiveX, обращающиеся к базам данных.

Разработчик приложения может работать с ADO тремя различными способами:

непосредственно вызывая интерфейсы и методы ADO с помощью функций программного интерфейса Win32, предназначенных для работы с СОМ;

применяя средства библиотеки MFC, созданных для OLE;

импортируя библиотеки типов ADO с помощью оператора ftimport.

Первый из этих способов предполагает детальное знакомство программиста с методикой применения технологии СОМ. В частности, необходимо следить за использованием указателей на интерфейсы, своевременно захватывая их и ос вобождая при помощи методов и Release, а для создания объектов ADO приходится явным образом функцию Второй способ, ориентированный на применение MFC OLE, упрощает работу с ADO посредством (wrapper class). Недостатки данного спо соба невозможность использования перечислимых типов данных из библио теки типов ADO, а также необходимость поставлять вместе с программой биб лиотеку динамической загрузки MFC DLL.

наконец, третий способ, основанный на включении библиотеки типов ADO оператором ttimport, предполагает создание вспомогательных классов-оболочек, а также автоматическую генерацию перечислимых типов и глобальных уникаль ных идентификаторов объектов ADO. Этот способ, на наш взгляд, наи более удобен, так как делает использование ADO в программах C++ таким же простым, как и в сценариях JScript и Script.

Одно из важных преимуществ применения оператора tfimport заключается в использовании так называемых указателей pointer) класса _com_ptr_t, а также классов для работы с типами данных BSTR и VARIANT.

Интеллектуальные указатели позволяют не беспокоиться о и вызо ве методов AddRef и Release, упрощая работу с указателями на интерфейсы СОМ.

Еще одна особенность, связанная с оператором ftimport — обработка ошибок при помощи исключений, Как известно, применение исключений для обработ ки ошибок вместо проверки кодов возврата сокращают объем листингов исход ного текста приложений, упрощают разработку и отладку Когда при создании объектов ADO или при выполнении методов ADO происходят ошиб ки, возникает исключение класса Этот вспомогательный класс уп рощает обработку ошибок, так как сам вызывает методы интерфейса о, Импортирование библиотеки типов ADO Ранее мы пользовались технологией импортирования библиотеки типов ADO, создавая ASP. Вспомните, что для каждого такого ния мы создавали файл с именем располагая его в корне виртуально Глава 4. Связь приложений с базами данных через ADO го каталога приложения. В области этого файла мы делали ссылку на библиотеку типов ADO следующего вида:

Что же касается программ то для импортирования библиотеки типов необходимо воспользоваться оператором ffimport, расположив его в области исходного текста программы;

Наиболее место для расположения этого файла — файл StdAfx.b, создаваемый автоматически системой разработки Microsoft C++ и содер жащий различные Разумеется, Вы включать оператор tfimport к файлы срр, содержащие обращения к ADO.

Как работает оператор tfimport?

Когда компилятор встречает такой оператор, ссылающийся на ту или иную библиотеку он генерирует каждой библиотеки два текстовых файла с и Например, при импортировании библиотеки ти пов ADO версии 2.0 создаются файлы с и Msado20.tli. Эти файлы создаются в каталоге с исходными текстами проекта приложения.

Файл содержит определения объектов и перечислимых типов а файл — классы-оболочки для методов объектной модели ADO. Вы можете просмотреть их содержимое при помощи любого текстового редактора, например в окне редактирования Microsoft Visual C++.

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

ttimport При этом, однако, необходимо, чтобы полный путь к каталогу, содержащему библиотеку (в нашем случае это был прописан в переменной среды LIB, PATH или INCLUDE. Есть и другая возмож ность — добавить этот путь в список каталогов Visual C++ на вкладке Directories панели Options, вызвав ее па экран при помощи строки Options меню Tools (рис. 4-44).

or | Debug Build fil d.

E Рис. 4-44. Добавление пути к каталогу с библиотекой типов ADO Базы данных в Интернете. Практическое После импортирования библиотеки типов выше способом может возникнуть проблема с константой EOF, определенной как значение -1. Эта кон станта обычно используется при работе с потоками ввода/вывода, однако как Вы скоро убедитесь, в ADO ей уготовано и иное Чтобы избежать кон фликта имен, мы переименуем EOF из библиотеки типов ADO в как это показано ниже:

\ rename ("EOF", "adoEOF") Обращение к интерфейсам и методам ADO Прежде привести полные исходные тексты приложения, написанного на C++ и обращающегося к базе данных средствами ADO, рассмотрим основные приемы обращения к интерфейсам и методам основанные на использова оператора Инициализация Автономное работающее с объектами ADO, должно до начала своей работы выполнить системы СОМ вызовом функции tialize. Перед завершением работы приложению необходимо освободить ресур сы, связанные с системой СОМ, при помощи функции Конечно, эти функции допустимо вызывать явным образом, однако определить глобальную структуру с конструктором и деструктором, выполня ющую указанные действия:

struct I { } } Установка с источником данных Прежде чем обращаться к базе данных, приложение должно установить соеди нение с источником данных. Для этого потребуется объект Connection.

В следующем фрагменте кода мы создаем объект Connection и записываем в переменную с именем сп указатель на интерфейс объекта:

= NULL;

= = Обратите внимание на то, как мы объявляем сп. Здесь мы ссы лаемся на пространство имен определенное в результате импорта библио теки типов ADO оператором Тип _ConnectionPtr определен как указа тель на интерфейс объекта Connection.

Глава 4. Связь приложений с базами данных через АОО Однако простое создание указателя еще не влечет за собой образование объекта. Для того чтобы создать объект, мы метод пе редавая ему в качестве параметра уникальный глобальный идентификатор объекта ADODB: Этот идентификатор извлекается из файла Msado20.tli, определенным в Microsoft Visual C++, при помощи C++.

Результат выполнения метода Createlnstance записывается в переменную hr типа Для проверки успеха завершения операции Вы должны использо вать макрос SUCCEEDED, например:

return;

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

Теперь, когда объект Connection успешно создан, можно открывать канал связи методом Open:

_bstr_t _bstr_t Здесь мы передаем методу Open имя источника данных, имя и пароль пользо вателя, а также параметр, режим открытия (синхронный или асинхронный). Константа опре деляет синхронный режим, установленный по умолчанию. Асинхронный режим (задается константой в нашей книге рассматривается.

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

Обращаем Ваше внимание на класс Он становится доступным в ре зультате выполнения импорта библиотеки типов и помогает работать с типом данных BSTR. Тип BSTR используется в программировании элементов СОМ для информации в виде текстовых строк Unicode. Класс облегча ет создание таких строк и выполнение над ними операций.

После завершения операций необходимо закрыть соединение с источником данных, вызвав метод Close:

Выполнение команды Для того чтобы выполнить команду, пользуясь установленным соединением с источником данных, необходимо вызвать метод Execute:

* from rs = NULL;

rs = В качестве первого параметра мы передаем методу строку команды.

Как Вы помните, это может быть оператор языка SQL, имя хранимой 212 Базы данных в Интернете. Практическое или имя таблицы базы данных. В нашем случае выполняется оператор SELECT, выбирающий все данные из таблицы managers.

Второй параметр метода Execute определяет параметры команды. В нашем случае параметры не используется, поэтому мы указываем специальное значение vtHissing, отсутствующий параметр.

И наконец, третий метода Execute указан как константа ad Эта константа определяет, что в первом параметре мы передали мето ду Execute строку SQL (а не имя хранимой процедуры или таблицы).

После выполнения метод Execute возвращает указатель на интерфейс набо ра записей ADODB: Набор записей представляет собой таблицу, созданную в результате выполнения команды.

Работа с набором записей Извлечение отдельных записей из набора необходимо выполнять в цикле. Здесь используется техника, аналогичная той, что применялась нами в сценариях JScript.

Для проверки условия завершения цикла программа должна анализировать содержимое свойство EOF объекта Recordset:

== i Здесь мы, однако, ссылаемся не на свойство EOF, а на переименованное при импорте библиотеки типов ADO свойство adoEOF. При достижении конца набо ра записей это свойство будет содержать значение VARIANT_FALSE.

Извлечение содержимого полей набора записей выполняется следующим образом:

_variant_t vManagerlD = = Здесь мы ссылаемся на элемент набора Fields при помощи метода передавая ему в качестве имя столбца, в котором находится нужное нам поле (можно также задавать номер столбца, начиная с нуля), После извлечения очередной записи надо передвинуть курсор на следующую запись набора Recordset, вызвав для этого метод MoveNext:

= break;

Извлеченные значения размещаются в переменных класса Далее мы расскажем о как выполнить из этого типа в более при вычные числовые и строчные типы данных.

Завершив операции над набором записей его следует закрыть при помощи метода Close:

rs->Close();

Глава 4. Связь приложений с базами данных через ADO Вызов хранимой процедуры В этом разделе мы рассмотрим способ вызова хранимой процедуры с парамет рами. Как мы уже говорили, использование хранимых процедур позволяет от делить данные от программ, что упрощает их создание и отладку.

Чтобы передать хранимой процедуре Вы должны вначале создать объект класса Command а затем при помощи метода определить необходимые Создание объекта Command выполняется так:

= NULL;

Далее надо команду к каналу с набором данных, устано вив значение свойства ActiveConnection:

= Так как команда выполняет вызов хранимой процедуры, в свойство Command Type следует записать значение ADODB:

= В свойство Вы должны записать имя хранимой процедуры (как переменную класса _bstr_t = займемся параметрами команды.

Вначале определим указатель на параметр как объект класса AOODB;

= NULL;

Теперь мы создаем сам параметр, указывая его тип, значение и размер данных:

_bstr_t param cmd->CreateParameter( -1, vtMissing);

Здесь имя параметра задано как User. Константа ADODB;

определя ет, что параметр является текстовой строкой. С помощью константы :

мы указываем, что данный параметр — входной. Четвертый параметр метода CreateParameter указывает максимальный размер данных как -1, что означает отсутствие ограничений на этот размер. И последний пара метр, значение параметра, указан как vtMissing (то есть Действительное значение входного параметра с именем User мы задаем при помощи метода Append:

_variant_t = Здесь мы вначале переменную vName из обычной текстовой строки закрытой нулем, а затем присваиваем ее значение свой ству Далее параметр добавляется в набор параметров методом Append.

214 Базы данных в Интернете. Практическое руководство Второй входной параметр добавляется аналогично:

= -1, = При создании выходного параметра мы используем константу :

_bstr_t param = 16, vtMissing);

= Далее команда выполняется (в нашем случае происходит запуск хранимой процедуры):

После ее параметра можно взять из свойства ok = Обработка ошибок В начале этой главы мы рассказывали о том, как выполняется обработка бок, возникающих при использовании объектов ADO. Как Вы знаете, ошибки попадают в ADO от и помещаются в набор Errors, причем в резуль тате одной команды может возникать сразу несколько ошибок. Для каждой ошибки создается объект который затем помещается в набор Errors.

Серверным JScript только два свойства объекта Error number и description, первое из которых содержит числовой код ошибки, рое — ее текстовое описание.

Программы C++ (так же как сценарии VB Script и программы, написанные на языке Microsoft Visual Basic) получают доступ ко всем свойствам объекта Error, перечисленным в таблице 4-4. Это Description (текст сообщения об ошиб ке), Number (код ошибки), (объект, вызвавший появление об ошибке от источника данных SQL), NativeError (ана логично SQLState), HelpFile (ссылка на файл справочной системы с объяснени ем ошибки) и HelpContext (идентификатор справочной системы с опи санием ошибки).

Если программа C++ обращается к объектам ADO с применением импорти рования библиотеки типов ADO посредством оператора tfimport, то при возник новении ошибочной ситуации возникает исключение класса Мы об рабатываем его с конструкции try-catch следующего вида:

Глава 4. Связь приложений с базами данных через ADO try = ex) I return;

Обработка ошибок выполняется функцией которой в качестве параметра сп передается указатель на Connection.

В начале работы функция AdoErrHandler получает набор Errors, содер жащий объекты Error, создаваемые для каждой ошибки:

Errors = NULL;

Errors= Этот набор, извлекаемый средствами метода GetErrors, мы будем обрабаты вать в цикле, так как объектов Error может быть создано несколько. Для деления количества элементов в Errors метод long nErrCount;

= Далее извлечение объектов Error можно следующим образом:

Error = NULL;

i = 0;

i < nErrCount;

i++) !

Error = Error = NULL;

} Здесь переменная цикла i принимает значения от 0 до числа элементов в наборе Errors. С метода мы по очереди извлекаем на интерфейсы объектов Errors, сохраняя их в переменной Error типа ADODB: :

rorPtr. После использования указатель Error освобождается методом Release, Затем мы присваиваем ему значение NULL.

Теперь для каждой ошибки (то есть для каждого извлеченного объекта Error) мы получить значения свойств. Эта операция выполняется с использо методов, предусмотренных в объекте Error:

CString Здесь мы извлекли номер ошибки методом преобразовали его в текстовую строку и записали в строчную переменную strNumber класса CString.

Базы данных в Интернете. руководство Аналогичные действия можно и для других свойств объекта Error:

st Полный текст функции обработки ошибок приведен в лис 4-57.

Пример программы В качестве примера приложения, написанного на C++ и обращающегося к ADO с применением импортирования библиотеки типов ADO, рассмотрим простую консольную программу просмотра записей таблицы managers из базы данных Bookstore. Эту базу мы создали в начале главы.

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

Login name: frolov Password: Manager list:

1 | frolov | 123 | 11.12.99 12:24:50 | Administrator 2 | Petrov | 123 | NULL | 3 | Sidoroff | 123 | NULL | 5 | NULL | 4 | admin | 123 | 05.12.99 09:50:10 | Salesjnanager Если же идентификатор или пароль введены неправильно либо если данный пользователь не обладает правами администратора, то на консоли появляется лишь сообщение о запрете доступа:

Login name: frolov Password: Access denied Рассмотрим исходные тексты программы.

Листинг файла создаваемого автоматически системой разработки Microsoft Visual C++, мы не будем приводить ради экономии места. В этот файл Глава 4. с базами данных ADO мы вручную строки импорта библиотеки типов ADO версии 2.0, как это ниже:

\ rename ("EOF", В 4-57 приведен исходный текст самой программы.

Листинг 4-57 хранится в файле ch4\CPPADOVCPPADO.cpp на прилагаемом к книге компакт-диске.

Глобальная переменная класса предназначена для инициа лизации СОМ, а также для освобождения ее ресурсов, связанных с данной программой после завершения ее работы:

struct Comlnit { } com_init;

Функция получающая управление после запуска приложения, вызы вает функцию login, определенную в нашей программе:

_tmain(int argc, argv[], int = 0;

NULL, : 0» { cerr инициализации MFC") = I I cout list:

I else return Функция login с консоли идентификатор и пароль пользовате ищет его в базе извлекает и проверяет права. Если пользователь 218 Базы данных в Интернете. Практическое зарегистрирован и обладает правами администратора, функция login значение а если нет — false.

Для администратора функция вызывает функцию извле кающую из базы данных и отображающую информацию о сотрудниках магазина.

login Рассмотрим исходный текст функции login.

В блоке try эта функция создает объект : Connection и открывает со единение;

NULL;

hr = = return false;

Затем она запускает хранимую процедуру Manage rLogin, имеющую три пара метра. В качестве двух входных параметров процедуре передается идентифика тор и пароль, а в качестве выходного возвращается строка с пользователя:

= NULL;

= = = = NULL;

_bstr_t param -1, vtMissing);

CHAR cout name:

Глава 4. Связь приложений с данных через ADO _variant_t = = -1, CHAR "Password:

cin vPassword;

param = 16, vtMissing);

= Идентификатор и пароль запрашиваются из стандартного потока ввода, свя занного с клавиатурой.

Определение возвращаемого значения выполняется путем простого сравне ния значения выходного параметра и текстовой строки _variant_t ok = if(ok return true;

else return false;

Заметим, что оператор сравнения перегружен в классе _variant_t, поэтому такая операция выполняется очень просто.

При ошибочных ситуаций управление передается в блок где выполняется вызов функции обработки ошибок try (см. стр.) 220 Базы данных в Интернете. Практическое { return false;

Так как ошибки к соединению с источником данных, в качестве параметра этой функции передается указатель на интерфейс нашего источника данных Функция getManagers Эта функция получает содержимое таблицы managers не с помощью хранимой процедуры, а выполняя строку SQL с SELECT:

= NULL;

rs = NULL;

try hr = hr = _bstr_t _bstr_t _bstr_t * = &vtMissing, :

В результате выполнения этого оператора создается набор записей класса Recordset. Он обрабатывается в цикле с использованием приемов, описанных нами ранее:

_variant_t _variant_t vLastLogin;

_variant_t CString = == { vName = Глава 4. Связь приложений с базами данных через ADO = = vRights = | | | | hr = break;

Для преобразования значений в текстовые строки и отображе ния их в консольном окне мы используем функцию исходный текст ко торой в листинге 4-59.

Исходный текст функции ошибок в лис тинге 4-58. Мы уже рассказывали раньше об использованных в нем приемах извлечения ошибок.

Листинг Вы найдете в файле ch4\CPPADO\adoerrhandler.cpp на прилагае мом к книге компакт-диске.

Служебная (листинг 4-59) нужна для преобразования значе ний тина VARIANT в текстовые строки.

Листинг 4-59 Вы найдете в файле ch4\CPPADO\vcrack.cpp на прилагаемом к книге компакт-диске.

Эта функция получает входной параметр как ссылку на класса предусмотренного в MFC для работы с переменными типа VARIANT.

Результат преобразования возвращается как текстовая переменная класса CString.

очень просто.

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

Обратите внимание на применение функций и выполнять такое преобразование для денежных данных и для зна чений CString var) CString strRet;

= (см. стр.) 222 Базы в Интернете. Практическое руководство case VT_EHPTY:

case strRet = break;

case break;

case strRet = break;

case VT_DATE:

strRet = break;

case strRet = V_BSTR( &var );

break;

default:

strRet = break;

} return strRet;

} Эти функции доступны при использовании библиотеки классов MFC. Но при необходимости Вы сможете построить подобную и приме нения средств MFC.

Вызов ADO через функции Win Если Вам больше нравится элементов ActiveX средства ми программного интерфейса то Вы можете обойтись без импортирова ния библиотеки типов (хотя этот способ предпочтительнее). В этом разделе мы расскажем о том, как к методам и свойствам объектов ADO без при менения оператора Обращение к интерфейсам и методам ADO Рассмотрим некоторые приемы обращения к интерфейсам и методам ADO, ос нованные на использовании функций интерфейса Win32, предназ наченных для работы с объектами СОМ (таких, как Инициализация СОМ и переменных Как и в предыдущем случае, для работы с объектами ADO Вам необходимо про систему СОМ вызовом функции а перед за вершением программы надо ресурсы СОМ при помощи функции CoUninitialize.

Отказавшись от импортирования библиотеки типов, мы не сможем восполь зоваться для создания строк типа BSTR классом Поэтому нам придется позаботиться об инициализации и освобождении ресурсов, связанных с такими строками. Эти операции удобно вместе с инициализацией и освобож А. приложений с базами данных через ADO ресурсов СОМ в конструкторе и деструкторе специального объекта ини циализации.

Например, для инициализации строки параметров подключения к источни ку данных мы вначале создаем глобальную переменную strAccessConnect типа CString и инициализируем ее образом;

CString );

Далее в конструкторе глобального объекта мы выделяем па мять для строки и записываем в нее данные из строки cessConnect:

BSTR bstrAccessConnect;

bstrAccessConnect = Перед работы программы деструктор объекта инициализации освобождает связанные со строкой bstrAccessConnect:

соединения с источником данных Для установки соединения с источником данных нам необходимо создать Connection. Так как мы отказались от импортирования библиотеки ADO, нам выполнять эту с помощью функции = NULL;

hr = S_OK;

hr = NULL, Обратите что для определения глобальных уникальных идентифи каторов ADO, его классов и констант мы включили в исходный текст нашей программы файлы и Файл должен быть включен толь ко в один файл Вашего проекта, Создавая объект функция CoCreatelnstance записывает указатель на этого объекта в переменную сп типа Результат выполнения операции сохраняется в переменной типа HRESULT. Так как при отказе от импортирования библиотеки типов ADO механизм обработки исклю от объектов ADO не используется, Ваше приложение должно проверять коды завершения вызываемых и методов.

После создания объекта Connection необходимо открыть соединение. Для этого вначале нужно вызвать метод для записи строки соединения, а затем вызвать метод Open, в объекте Connection:

hr = hr = bstrEmpty, bstrEmpty, 224 Базы данных в Интернеге. Практическое руководство Так как все параметры устанавливаются методом мы указали для первых трех параметров метода Open пустые значения bst rEmpty. Строка bst определена как пустая строка:

CString BSTR = Последний параметр метода Open задает синхронный режим открытия кана ла связи с источником данных.

Выполнение команды Прежде чем выполнить команду, программа должна создать объект Command, вызвав для этого функцию = NULL;

hr = NULL.

В случае успеха ссылка на интерфейс команды записывается в cmd типа ADOCommand*.

Далее нужно установить связь между командой и каналом связи с источни ком данных, для которого эта команда будет Эта операция выпол няется с применением метода putref_ActiveConnection:

= И наконец, текст записывается методом hr = В нашем случае будет исполняться выборка всех из таблицы mana gers. Переменная содержащая эту команду, инициализируется сле дующим образом:

CString * BSTR bstrCommand;

bstrCommand = Теперь мы можем выполнять команду при помощи метода Execute:

ADORecordset* rs = NULL;

hr = &vtEmpty2, adCmdText, Параметр adCmdText указывает, что команда представляет собой строку про SQL. В результате выполнения команды будет создан записей Recordset, причем указатель на интерфейс соответствующего объекта будет за писан в переменную типа ADORecordset*.

Работа с набором записей Как обычно, извлечение отдельных записей из набора необходимо выполнять в цикле.

. Для проверки условия завершения цикла программа должна метод get_EOF, определенный в Recordset:

Глава 4. Связь приложений с базами данных через ADO bEOF = = По достижении конца набора этот метод вернет значение, равное константе Цикл обработки набора записей выглядит, например, так:

== = rs->get_EOF(&bEOF);

break;

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

Извлечение и обработка отдельных записей выполняется следующим образом.

Вначале при помощи метода мы получаем указатель на интерфейс набора Fields:

adoFields = NULL;

= break;

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

= NULL;

= NULL;

hr = break;

hr = break;

hr = break;

hr = break;

Здесь мы извлекли содержимое полей идентификатора сотрудника и его имени Name.

Базы данных в Интернете. Практическое Чтобы перейти к обработке следующей записи набора, мы вызываем метод MoveNext:

= break;

Заметим, что отсутствие исключений заставляет нас проверку кода завершения вызываемого метода, что увеличивает объем листинга.

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

Исходный текст программы Вы найдете в листинге 4-60.

Листинг 4-60 хранится в файле на прилагаемом к книге компакт-диске.

Переменные strAccessConnect, и класса начены для строчных переменных класса BSTR с именами и bstrCommand CString BSTR bstrAccessConnect;

CString BSTR bstrEmpty;

CString * from BSTR В строке bstrAccessConnect записана строка параметров, необходимых для подключения к источнику данных. Переменная bstrEmpty представляет собой пустую а переменная содержит строку SQL, с помощью ко торой мы получим все записи из таблицы managers.

Кроме того, нам две пустые и vtEmpty2 клас са VARIANT:

VARIANT vtEmpty;

VARIANT В области глобальных нашей программы находится определение переменной com_init класса Comlnit, предназначенной для выполнения иници ализации переда началом работы программы и для освобождения ресурсов пе ред ее struct Comlnit :

:

bstrAccessConnect = Глава 4. приложений с базами данных через ADO bstrEmpty = = VT_ERROR;

= = = :

{ } } В задачу конструктора класса входит вызов уже знакомой Вам функции а также инициализация перечисленных выше переменных классов BSTR и VARIANT. Деструктор функцию а при по мощи функции освобождает ресурсы, для строк клас са Отображение содержимого таблицы выполняется функцией получающей управление от функции после запуска нашей про граммы и инициализации библиотеки классов MFC.

argc, TCHAR* argv[], TCHAR* I int nRetCode = 0;

NULL, cerr инициализации MFC") nRetCode = 1;

else getManagers();

return nRetCode;

' В области локальных функции определены указате ли на интерфейсы rs и = NULL;

rs = NULL;

NULL;

В переменную сп записывается указатель на Connection, для чего используется функция объект указанного класса:

= S_OK;

= NULL, Базы данных в Интернете. Практическое Если данный объект был успешно создан, мы записываем в свойство Соппес объекта Connection строку параметров соединения, вызывая для этого метод hr = cn->put_ConnectionString(bstrAccessConnect);

Далее соединение с источником данных открывается методом Open. Так как все параметры соединения уже записаны в свойство мы ука зываем первые три метода Open как пустые, передавая через них стро ку bstrEmpty:

= cn->Open(bstrEmpty, bstrEmpty, bstrEmpty, На этапе происходит создание объекта Command, для чего мы опять применяем функцию но с другими параметрами. Указатель на интерфейс созданного объекта команд записывается в переменную hr = NULL, Чтобы связать объект Command и соединение, мы записываем указатель на интерфейс соединения в свойство ActiveConnection объекта Connection, вызы вая метод putref_ActiveConnection:

= Текст команды записывается методом в свойство объекта Command:

hr = Теперь можно выполнять команду, вызывая метод Execute. В качестве первых двух параметров мы передаем этому методу пустые переменные класса VARIANT.

Третий параметр что необходимо выполнить строку SQL, заданную в свойстве объекта Command. И наконец, через параметр методу Execute адрес в которую будет записан указатель объект класса содержащий набор записей, извлеченных из табли цы managers:

hr = &rs);

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

Перед запуском цикла мы определяем переменные класса ColeVariant, в ко торые будут записаны значения, извлеченные из строк таблицы:

COleVariant COleVariant COleVariant COleVariant vLastLogin;

COleVariant Глава 4. Связь приложений с базами данных через ADO Кроме того, мы определяем рабочую переменную класса а также которая будет использована для обнаружения конца записей:

CString strTmp = bEOF = Далее мы извлекаем признак конца набора записей при помощи метода get_EOF:

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

adoFields = NULL;

Следующие предназначены для хранения указателей на интер фейсы объектов Filed, создаваемых для хранения содержимого отдельных по лей текущей записи набора Recordset:

= NULL;

ADOField* = NULL;

= NULL;

NULL;

= NULL;

Сам цикл организован следующим образом:

== VARIANT_FALSE) { rs->get_Fields(&adoFields);

break;

= break;

hr = break;

hr = break;

hr = hr = break;

(см. стр.) Базы данных в руководство break;

= break;

break;

hr = break;

hr break;

I | | | break;

hr = break;

В начале цикла мы получаем очередную строку набора вызывая метод get_Fields для нашего набора записей.

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

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

После обработки всех извлеченных мы закрываем набор записей, а также соединение с источником данных:

rs->Close();

cn->Close();

Связь приложений с базами данных через OLE DB В предыдущей главе мы практические приемы использования объектного интерфейса ADO в серверных сценариях ASP и в автономных при ложениях Microsoft на языке программирования C++. Как Вы смогли убедиться, и в и в другом случае применяются достаточно эф фективные методы к базам данных. Эти методы особых затруднений при реализации и отладке. Интерфейс автоматизации, определен ный в рамках объектов ADO, позволяет к этим объектам из прило жений, составленных практически на любом языке программирования, в том числе из сценария (таких, как JScript и Script).

Мы также говорили, что объекты ADO представляют собой объектный ин терфейс уровня приложений, созданный на базе другого объектного интерфей са, а именно OLE DB. Этот интерфейс — открытый стандарт, разработанный специально для доступа к базам данных, как ре ляционных, так и (таких, как серверы почты, базы данных VSAM и т. д.).

Создавая приложения OLE DB, Вы можете реализовать в нем как функции провайдера данных, так и функции потребителя данных. что при со здании с базами данных в Интернете и в в случаев функции потребителя данных, какой-либо гото вый провайдер (например, для ODBC для текстовых файлов).

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

Применение объектного интерфейса OLE DB в большинстве приложений, созданных для Интернета, нам представляется необязательным, а в некоторых случаях и нежелательным. Фактически все операции с реляционными базами данных можно в рамках объектного интерфейса ADO. Именно эта технология, простая в применении отладке, рассматривается Microsoft как наиболее современная и подходящая создания приложений Интернета. Тем не менее, для того у Вас сложилась более картина, мы рассмотрим некоторые случаи реализации этого метода доступа в автономных приложени ях Windows, написанных с использованием Microsoft C++.

232 Базы данных в Интернете. Практическое В рамках одной главы невозможно рассказать об объектах OLE DB хоть сколько-нибудь поэтому мы изложим только основы. Вы сможете применить полученные знания па практике, создавая, расширения сервера Web, обращающиеся к базам данных через OLE DB, в виде приложений CGI или ISAPI.

Программная модель OLE DB Так же как и в случае только что объектной модели ADO, базо выми элементами модели OLE DB является набор объектов. Эти объекты применяются для с базами данных и сеансов, выполнения команд с параметрами, получения результата этих ко манд в виде переменных или наборов записей, обработки событий и ошибок.

Рассмотрим порядок приложения к базе данных с применением программной модели OLE DB.

Инициализация среды выполнения Работа OLE DB основана на модели компонентных объектов СОМ, поэтому сразу после начала своей работы приложение должно выполнить инициализа цию системы СОМ. Как обычные приложения выполняют эту иници ализацию вызовом функции В результате становится возможным загрузка объектов провайдера OLE DB и работа с этими объектами.

Инициализация источника данных Прежде чем обращаться к приложение OLE DB должно соединение с источником данных. Это действие требуется и при использовании метода доступа ADO, однако установка соединения с применением объектов OLE DB выполняется по-другому.

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

Как минимум требуется указать имя данных, имя пользователя и пароль.

Во-вторых, приложение должно вызвать метод интерфейса выполняющий указанных выше свойств. Интер фейс становится доступным после инициализации OLE DB.

И наконец, в-третьих, приложению необходимо вызвать метод ин терфейса IDBInitialize, что обязательно для инициализации источника данных.

После завершения работы с соединением его надо закрыть, вызвав метод интерфейса IDBInitialize.

Открытие сеанса Сеанс играет соединению с данных в ADO. В рамках сеанса приложение может выполняя те или иные операции с Для открытия сеанса приложение использует метод интерфей са IDBCreateSession.

Глава 5- с базами данных через OLE DB Подготовка команды и параметров При создании сеанса методом CreateSession про грамма получает интерфейс позволяющий созда вать команды.

Устанавливая методом SetProperties интерфейса различ ные атрибуты программа влияет на ее исполнение.

Далее необходимо задать текст команды. Эта операция выполняется методом интерфейса ICommandText. Текст команды представляет собой строку языка имя хранимой SQL Server или имя таб лицы.

При необходимости средствами метода Prepare интерфейса программа может выполнить подготовку команды. Эта опера имеет смысл, если команда представляет собой строку языка Transact-SQL (а не хранимую процедуру) и будет выполняться многократно.

Если команда имеет параметры команда запуска хранимой про цедуры с параметрами), необходимо описать параметры команды, создав груп пу доступа, называемых Accessor.

Выполнение команды Для команды программа должна вызвать метод Execute интерфей са ICommandText.

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

Обработка результатов выполнения команды Результаты выполнения команды OLE DB наборами строк, отфор матированными в виде таблицы. Для извлечения из набора Вы использовать ряд интерфейсов.

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

Обычно при извлечении данных из набора записей приложение вначале вы зывает метод CreateAccessor интерфейса lAccessor, выполняя привязку данных к переменным. Далее все записи извлекаются в цикле с помо щью метода интерфейса А затем программа вызывает ме тод GetData интерфейса IRowset для получения данных из строк набора и запи си этих данных в указанные в процессе привязки.

Обработка ошибок Обработка возникающих при применении методов OLE DB, намного сложнее, чем обработка ошибок, связанных с использованием ADO.

234 Базы данных в Ошибки могут создании многочисленных объектов OLE поэтому Ваше приложение должно код завершения функций. Если метод какого-либо интерфейса с и соответствующее его При этом Вам потребуются интерфейсы и В таблице 5-1 кратко перечисленные интер фейсы.

Таблица связанные с обработкой ошибок Интерфейс ISupportErrorlnfo Этот интерфейс определить, какие объекты, ситуации, можно получить от вызвавшего ошибки. В частности, он получить таких объектов, создаваемых для получения ин формации об ошибках OLE DB l Erorl nfo Данный позволяет получить об ошибке, имя ошибку, глобальный уни кальный идентификатор объекта GUID, создавшего ошибку, а так же имя файла системы и раздела системы, ошибку lErrorLookup Этот интерфейс обеспечивается провайдером OLE DB. Использу ется интерфейсами и l Erorl nf o для доступа к ошибки OLE DB ISQLErrorl nfo Данный интерфейс нужен для значения и естественного об ошибке. Обеспечивается ми ODBC Объекты OLE DB Для работы с OLE DB Ваше должно создать ряд объектов OLE DB, а затем обращаться к методам и свойствам этих Ниже мы рассмотрим некоторые методы и свойства важнейших OLE DB, необходимые для создания автономных C++, выполня ющих запросы к данных.

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

= hr = CoCreateInstance(CLSID_MSDASQL, NULL, Глава 5. Связь приложений с данных через OLE DB Здесь мы передаем кон станту идентификатор класса Третий параметр функции CoCreatelnstance, заданный с помощью макроко манды CLSCTX_INPROC_SERVER, что источник данных SQLOLEDB работает как встраиваемый в процесс (in-process server).

Четвертый и параметры задают соответственно идентификатор интер фейса и адрес pIDBInitialize, в которую записыва ется указатель на интерфейс IDBInitialize.

Если объект создан успешно, значение будет равно true. В этом случае Ваша программа может продолжить работу с источником данных, выпол няя его и создание сеанса.

завершения работы с источником данных программа должна вызвать метод объекта SQLOLEDB, воспользовавшись для этого интерфейсом IDBInitialize:

Далее программа освободит нужный более указатель на интерфейс IDBIni tialize, вызвав метод Release:

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

Структура DBPROP определена следующим образом:

typedef struct tagDBPROP { DBPROPID vValue;

} Ее поля описаны в таблице 5-2.

Таблица 5-2. Поля структуры DBPROP Поле Описание dwPropertylD свойства, параметры в данной структуре dwOptions Параметры В поле Вы можете записать константы Первая из них означает, что для данного свойства нужно обяза тельно задать а вторая что данное свойство задавать обязательно dwStatus Результат записи или чтения свойства. Устанавливается провайде ром и может использоваться для получения информации о успешно ли операция Базы данных в Таблица 5-2. Поля структуры Поле Описание Дополнительный идентификатор столбца, к которому относится данное свойство. Если свойство ко всем в это поле необходимо записать Значение (типа VARIANT).

Если свойство, значение которого не установлено и для не по в это поле записывается константа VT_EMPTY.

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

Таблица 5-3. Значения поля dwStatus Описание Значение свойства было установлено ошибок Было указано неправильное значение поля colid струк туры DBPROP Было указано неправильное значение поля структуры DBPROP Неправильное в vVal ue Значение свойства не может быть так как приведет к конфликту с параметрами других свойств Была попытка установить для однако для некоторых столбцов это свойство NOTSET Свойство не было в указанное значение.

Причина этого в том, что для параметра dwOptions ука зано значение в виде константы и при этом установка свойства в значение невозможна NOTSETTABLE Была попытка установить значение свойства, только для чтения. Это значе ние свидетельствует, что сделана попытка изменить значение свойства в группе свойств после выполнения инициализации источника данных DBPROPSTATUS Установка свойства была выполнена из-за того, что провайдер не данное свойство или набор.

Это и в том случае, если потре битель попытку прочитать или изменить свойств, не входящих в инициализации, а данных не зирован Глава 5. Связь приложений с базами данных через OLE Итак, для инициализации соединения с источником данных нам сив структур DBPROP, элементы которого описывают свойства источника В простейшем случае требуется задать четыре свойства:

уровень приглашения, определяющий, нужно ли выводить на экран пригла шения для пользователя;

имя источника данных DSN;

имя пароль пользователя для доступа к источнику данных.

Для хранения этих свойств мы массив из четырех элементов:

DBPROP Далее нужно выполнить инициализацию элементов массива rglnitProperties.

В поле первого элемента массива (уровень приглашения) мы записываем константу = Таким образом обозначается, что данный элемент будет содержать свойства, уровень приглашения.

свойство имеет отношение ко всем столбцам, поэтому в поле мы значение = Свойство, определяющее уровень является обязательным (как и все остальные три свойства нашего массива). Поэтому в поле dwOptions ука зана константа DBPROPOPTIONS_REQUIRED:

= Установка значения свойства выполняется в три приема:

= = Вначале инициализируется имеющее тип VARIANT, с помощью функции В результате такой инициализации в ноле будет записа но значение VT_EMPTY.

Далее мы указываем в поле vt тип данных как VT_I2 (двухбайтовое целое со знаком), а затем записываем в поле константу Эта кон станта указывает, что в процессе инициализации пользователю не следует вы на экран никаких приглашений.

Все возможные значения данного свойства перечислены в 5-4.

Второй элемент массива rglnitProperties определяет имя источника данных.

Идентификатор соответствующего свойства задается в поле dwPropertylD с по мощью = В поля dwOptions и colid этого и двух элементов массива rglnit мы записываем и соот 238 Базы данных в Интернете. Практическое = DBPROPOPTIONS_REQUIRED;

Pages:     | 1 | 2 || 4 | 5 |   ...   | 6 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.