[an error occurred while processing this directive]
4.2.6. Компонент доступа к базам данных ADO
Компонент DataBaseAccess
Компонент DataBaseAccess предназначен для обеспечения доступа к информации, хранимой в базах данных, и использует ActiveXDataObjects (ADO). Данный раздел посвящен технологии ADO и возможностям ее использования в рамках активных серверных страниц.
Технология ADO позволяет писать клиентские приложения для доступа и манипулирования данными, хранящимися в БД. Основные преимущества ADO: простота использования, высокая скорость, требуемый малый объем верхней памяти и дискового пространства. Здесь мы рассмотрим одну из реализаций ADO - ADODB, оптимизированную для работы с MicrosoftOLEDB, включая MicrosoftODBC для OLEDB.
Объекты Connection, Recordset и Command - основные элементы ADO для взаимодействия с данными. Каждый из перечисленных объектов имеет коллекцию Properties. Структурная модель объектов ADO приведена ниже на рисунке. Рассмотрим по порядку все три объекта.
Объект Connection
Объект Connection представляет соединение с источником данных OLEDB. Объекты Connection можно создавать независимо от ранее созданных объектов. Объект Connection представляет собой выделенный сеанс связи с источником данных. В случае архитектуры клиент/сервер этот объект может выступать эквивалентом соединения с сервером. Используя коллекции, методы и свойства объекта Connection, можно выполнять следующее:
Коллекция Errors содержит в себе все объекты Error, которые относятся к одиночным операциям. Любая операция ADO может генерировать одну или несколько ошибок. При появлении ошибки один или несколько объектов Error могут быть помещены в коллекцию Errors. Когда другая операция генерирует ошибку, то коллекция Errors очищается, и в нее могут быть помещены новые объекты Error. Для принудительной очистки коллекции Errors используется метод Clear. Некоторые свойства и методы возвращают предупреждения, которые не прерывают выполнение программы. Для получения детального описания каждой ошибки можно воспользоваться следующими свойствами:
В таблице приведены три примера используемых ошибок:
Объект Command
Объект Command можно создавать независимо от ранее созданных объектов Connection, определив его свойство ActiveConnection в строке команды. Когда ADO создает объект Connection, он не устанавливает соответствие между этим объектом и переменными объекта. Кроме того, когда ставится в соответствие составной объект Command соединению, необходимо отдельно создать и открыть объект Connection; это назначит свойство для переменной объекта. Если не установить свойство ActiveConnectionобъекта Command в переменную объекта, то ADO создаст новый объект Connection для каждого объекта Command, даже при использовании той же строчки. Объекты Command используются для получения записей и создания объектов Recordset, для выполнения больших операций или для изменения структуры БД. Используя коллекции, методы и свойства объекта Command можно производить следующие действия:
Объект Command содержит коллекцию Parameters. Используя метод Refresh коллекции Parameters можно получить информацию о параметрах хранящихся процедур или для параметризации запроса, определенным в объекте Command. Если не определен объект Parameter и обращение идет к коллекции Parameters перед вызовом метода Refresh, то ADO автоматически вызывает этот метод и заполняет коллекцию Parameters. Зная имена свойств параметров хранимой процедуры или параметризированного запроса, который нужно вызвать, можно создать объекты Parameter с соответствующими свойствами и, используя метод Append, добавить их в коллекцию Parameters. Это позволит устанавливать и возвращать значения параметров без вызова метода Refreshдля коллекции Parameters для получения от провайдера информации о параметрах. Для удаления объектов Parameter из коллекции Parameters используется метод Delete.
Используя различные коллекции, методы и свойства объектов Parameter можно выполнять следующее:
Для обращения к объекту Parameter по его порядковому номеру или имени можно использовать следующие варианты:
command.Parameters(0) command.Parameters("name") command(0) command("name") command![name]
Объект Recordset
Объект Recordset представляет полный набор записей таблицы данных или результат выполненной команды. В любое время объект Recordset ссылается только на одну запись из текущего набора. Объекты Recordset можно создавать независимо от ранее созданных объектов Connection путем указания метода Open в строке команды. Когда ADO создает объект Connection, он не устанавливает соответствие между этим объектом и переменными объекта. Кроме того, при открытии составного объектаRecordset нужно отдельно создать и открыть объект Connection; это назначит свойство для переменной объекта. Если не используется переменная объекта, когда открывается объект Recordset, то ADO создает новый объект Connection для каждого нового объекта Recordset, даже если пропущена эта операция. Объекты Recordset используют для управления данными на уровне записей. При использовании ADO, почти всегда управление данными происходит с помощью объектов Recordset. Все объекты Recordset строятся с использованием записей (строк) и полей (столбцов). Возможно использование четырех различных типов курсора при открытии объекта Recordset:
Установить необходимый тип курсора можно с помощью свойства CursorType объекта Recordset или указать одноименный аргумент при вызове метода Open. Если пользователь не определил тип курсора, то ADO по умолчанию открывает курсор типа Forward-onlycursor. Пользователь может создавать столько объектов Recordset, сколько ему нужно. Различные объекты Recordset могут обращаться к одним и тем же таблицам и записям, не конфликтуя при этом. При создании объекта Recordset текущая запись отмечается как первая запись, а свойства BOF и EOF устанавливаются False. Если не существует ни одной записи, то свойство RecordCount устанавливается в 0, а свойства BOF и EOF устанавливаются True. Наряду с методом Moveможно использовать методы MoveFirst, MoveLast, MoveNext и MovePrevious, а также свойства AbsolutePosition, AbsolutePage и Filter для переопределения текущей записи. При использовании курсора типа Forward-onlycursor можно пользоваться только методом MoveNext. При использовании метода Move для обращения к каждой записи, нужно использовать свойства BOFи EOF для определения достижения начала или конца объекта Recordset. Объект Recordset поддерживает два способа обновления данных: прямое и пакетное. При прямом обновлении все изменения в данных записываются в основной источник данных сразу же после вызова метода Update. В случае пакетного обновления, провайдер сначала кэширует все произведенные изменения, а затем одним вызовом метода UpdateBatch пересылает их в базу данных. После вызова метода UpdateBatch для проверки возможного конфликта данных используется свойство Status. Заметим, что пакетный метод обновления можно использовать только при двух типах курсора: Keysetcursor и Staticcursor.
Коллекция Fields содержит все объекты Field объекта Recordset. Каждый объект Field соответствует столбцу во множестве Recordset. Используя свойство Value объекта Field, можно устанавливать или возвращать данные для текущей записи. Используя коллекции, методы и свойства объекта Field, можно выполнять следующие действия:
Для обращения к объекту Field в коллекции по порядковому номеру или имени используются следующие способы:
recordset.Fields(0) recordset.Fields("name") recordset(0) recordset("name") recordset![name]
Коллекция Properties
Объекты ADO имеют два типа свойств: встроенные и динамические. Встроенные свойства - это свойства, реализованные в ADO и доступные для любого нового объекта. Кроме того, встроенные свойства не являются объектами Property в коллекции Properties, поэтому пользователь может изменять их значения, но не может изменять их характеристики или удалять их. Многие провайдеры OLEDB предоставляют дополнительные свойства объектов. Такие дополнительные свойства называются динамическими и являются объектами Property в коллекции Properties. Объекты Property имеют четыре встроенных свойства:
Каждый объект Property соответствует какой-либо характеристике объекта ADO. Для обращения к объекту Property из коллекции по имени используется следующий способ:
object.Properties("name")
Для обращения, например, к свойствуValue объекта Property используется такое же выражение. По контексту обращения определяется: обращаетесь ли Вы к самому объекту Property или к свойству Value объекта Property.
Организация работы с БД с помощью ASP
Для демонстрации вышеизложенного приведем пример ASP-страницы, которая устанавливает соединение с БД через ODBC, производит выборку и пересылает данные клиентскому броузеру.
<HTML> <BODY> <FONTFACE="MSSANSSERIF" SIZE=2> <FORMACTION="/advworks/ ........ " METHOD=POST> <!-- Установление соединения --> <% Setdb=Server.CreateObject("ADODB.Connection") db.Open "AWTutorial" ' имя БД в ODBC SQLQuery="SELECT * FROMCustomers" SetRScustomerList=db.Execute(SQLQuery) %> <!-- Формирование шапки выходной таблицы --> <TABLEWIDTH=600 BORDER=0> <TR> <TDALIGN=CENTERBGCOLOR="#800000">Название фирмы</TD> <TDALIGN=CENTERBGCOLOR="#800000">Фамилия, Имя</TD> <TDALIGN=CENTERWIDTH=150 BGCOLOR="#800000">Адрес E-mail</TD> <TDALIGN=CENTERBGCOLOR="#800000">Город</TD> <TDALIGN=CENTERBGCOLOR="#800000">Штат/Провинция</TD> </TR> <!-- Формирование строк выходной таблицы--> <% DoWhileNotRScustomerList.EOF %> <TR> <TDBGCOLOR="f7efde" ALIGN=CENTER> <%= RScustomerList("CompanyName")%> </TD> <TDBGCOLOR="f7efde" ALIGN=CENTER> <%= RScustomerList("ContactLastName") & ", " %> <%= RScustomerList("ContactFirstName") %> </TD> <TDBGCOLOR="f7efde" ALIGN=CENTER> <AHREF="mailto:"> <%= RScustomerList("ContactLastName")%> </A>< /TD> <TDBGCOLOR="f7efde" ALIGN=CENTER> <%= RScustomerList("City")%> </TD> <TDBGCOLOR="f7efde" ALIGN=CENTER> <%= RScustomerList("StateOrProvince")%> </TD> </TR> <% RScustomerList.MoveNext Loop %> </TABLE> </BODY> </HTML>
4.2.7. PowerBuilder 5.0
PowerBuilder 5.0 позволяет использовать два подхода для построения Intranet-приложений: статический и динамический.
Статический подход подразумевает использование возможности сохранять содержимое DataWindow в формате HTML. Этим механизмом можно воспользоваться как в среде разработки, так и в run-time. Для этого в среде разработки используется команда SaveRowsAs (в режиме просмотра результатов), в run-time применяется функция класса DataWindowcontrol - SaveAs:
dwcontrol.SaveAs(filename, saveastype, colheading)
где filename - имя файла, куда сохранять; saveastype - тип сохраняемого файла (в данном случае - HTMLTable); colheading (необязательный параметр) - булево значение, определяющее, следует ли включать заголовки столбцов DataWindow в начало файла (по умолчанию - TRUE).
Для задач периодической публикации статических данных в Internet такой подход позволяет легко создавать HTML-страницы и размещать в них отчеты любой сложности без знания языка HTML. При этом для работы с такими данными на компьютере-клиенте не требуется устанавливать среду PowerBuilder - достаточно одного лишь Web-броузера.
Динамический подход основан на использовании управляющих элементов ActiveX различных фирм (в том числе и Sybase), реализующих богатые возможности просмотра, навигации и т.п. для Web. В начальном релизе доступен управляющий элемент ActiveX - WebViewer подразделения VisualComponents корпорации Sybase. Он позволяет осуществлять просмотр и навигацию для узла Web. Используя WebViewer, разработчик может кодировать пользовательские события, способные автоматически инициировать извлечение информации из Web. В дополнение к управляющему элементу WebViewer, разработчики могут использовать управляющие элементы для передачи файлов (FTP, HTTP и др.), подсоединения клиент-серверных приложений к Web-серверам, управления поведением стандартных броузеров, таких как NetscapeNavigator и MicrosoftInternetExplorer и т.п. Кроме того, доступен также ActiveX-компонент FormulaOne/NET, представляющий собой Internet-реализацию Excel-совместимой электронной таблицы.
В настоящее время доступен пакет дополнений, включающий в себя кроме указанных выше возможностей следующие:
DataWindowPlug-in позволяет отображать на Web-странице файл PowersoftReport (PSR), который может быть просмотрен с использованием NetscapeNavigator или MicrosoftInternetExplorer версии 3.0. Созданный в PowerBuilder или InfoMaker отчет вы можете сохранить в виде PSR-файла с учетом форматов представления данных, который затем и помещается на HTML-страницу командой EMBED языка HTML (my_report.psr - имя PSR-файла с данными):
<embedsrc=my_report.psr width=650 height=350>
WindowPlug-in является очень мощной технологией для переноса клиент-серверных приложений в Internet. WindowPlug-in позволяет выполнять приложения PowerBuilder в броузере Netscape (или в любом броузере, поддерживающем NetscapeNavigatorPlug-in - как, например, MicrosoftInternetExplorer версии 3.0). Это означает, что вы имеете возможность открыть дочернее окно PowerBuilder, в котором допускается размещение любых элементов управления PowerBuilder, таких как кнопки, списки, графики, строки редактирования, Tab-странички, деревья, OLE-объекты и т. п. Приложение может использовать технологию DataWindow для соединения с базой данных через "родные" драйверы или через драйверы стандарта ODBC. Более того, WindowPlug-in может взаимодействовать с распределенными частями приложения, располагающимися на различных платформах - например, на Unix или WindowsNT. Такое окно PowerBuilder содержится в динамической библиотеке PowerBuilder (pbd или dll) на Web-сервере и загружается Web-броузером с помощью следующей команды:
<embedsrc=my_windows.dllwidth = 650 height=350 window=w_detail>
Здесь my_windows.dll - имя динамической библиотеки PowerBuilder, содержащей дочернее окно w_detail. Таким образом, разработчик получает возможность выполнять стандартные дочерние окна PowerBuilder внутри Web-броузера, что устраняет необходимость написания HTML-кодов и CGI-программ. Кроме того, устраняются ограничения HTML по пользовательскому интерфейсу и имеется возможность использовать богатейшую функциональность DataWindow.
Web.PB - это новая технология, позволяющая создавать распределенные приложения с использованием Web-сервера. Web.PB обеспечивает доступ любого Web-броузера к ресурсам сервера приложений PowerBuilder. Такая методология использует полную функциональность PowerBuilder, включая DataWindow, огромные возможности языка PowerScript и объектно-ориентированный подход для построения распределенного приложения. Созданный разработчиком сервер приложений имеет возможность динамически, "на лету", генерировать HTML-страницы и посылать их Web-броузеру через Web-сервер. При этом могут использоваться протоколы CGI, NSAPI или ISAPI. Такой подход полностью соответствует архитектуре "тонкого" клиента, где единственным требованием к клиентскому компьютеру является наличие Web-броузера. Данная схема обеспечивает полный доступ из броузера к атрибутам и методам любых невизуальных объектов на сервере приложения, вплоть до передачи аргументов.
Архитектура Web.PB связывает сервер приложений, построенный с помощью PowerBuilder, с Web-сервером и, далее, через него - с Web-броузером.
По информации от разработчиков PowerBuilder, в следующей, шестой, версии, работе с Internet будет уделено еще более пристальное внимание.
4.2.8. Взаимодействие FoxPro с Web-броузерами
Специальное расширение InternetSearchWizard для среды разработки клиент/серверных приложений VisualFoxPro компании Microsoft позволяет легко создавать прикладные программы, к которым могут обращаться по сети Internet клиенты системы Web, функционирующие на платформах PC, AppleMacintosh и Unix.
Модуль InternetWizard для VisualFoxPro шаг за шагом проводит программистов через процесс описания интерактивного поведения создаваемых приложений, а затем автоматически генерирует сценарий, поддерживающий интерфейс CGI, необходимый для обработки Web-запросов на сервере FoxPro. Построенные таким образом приложения работают полностью на сервере, воспринимаемом удаленным Web-броузером так же, как и любой другой Web-сервер. При этом "на лету" генерируются страницы формата HTML, представляющие собой формы, заполнив которые пользователь может запросить ту или иную информацию.
Затем сценарий CGI, сгенерированный программой InternetSearchWizard, преобразует запросы, введенные пользователем на HTML-странице, в последовательность операторов на языке SQL, которые и передаются в СУБД FoxPro. БД возвращает данные обработчику сценариев CGI, а он посылает их обратно пользователю в форме HTML-страницы или в виде DBF-файла.
Этот процесс предназначен для конечного пользователя, которому для получения данных через Internet из удаленной БД FoxPro не нужно знать, как строить SQL-операторы или HTML-страницы.
4.2.9. Специализированные Web-серверы для доступа к БД
Сервер приложений BaikonurWebApplicationServer
Baikonur - программный продукт компании EpsylonTechnologies, предназначенный для быстрой разработки приложений, ориентированных на использование Web-броузеров в качестве клиентских мест для доступа к базам данных во внутрикорпоративных сетях Intranet, а также Internet. Собственно Baikonur представляет собой сервер приложений, частным случаем которого является Web-сервер приложений, в состав поставки входят еще и дополнительные библиотеки для различных средств программирования, в частности для BorlandDelphi (для C++, Java, JavaScript - в старших версиях).
BaikonurServer предназначен для построения Internet/Intranet-систем на платформе Windows NT. Самое простое, что может делать BaikonurServer, - это служить в качестве обыкновенного Web-сервера, имеющего дело со стандартными HTML-документами. Однако, в отличие от стандартного Web-сервера, основные ресурсы, которыми оперирует Baikonur-сервер, - это информационные потоки и задачи. В результате при помощи сервера Baikonur появляется возможность построения функционально весьма сложных и разветвленных информационных систем.
Системы в архитектуре клиент-сервер устроены так, что исполняемый код одновременно находится и на сервере, и на клиенте. Как правило, серверной стороной выступает какой-либо SQL-сервер, например, от компании Oracle, Informix, Borland, Microsoft, IBM и др., а задачей клиентского места является диалоговая работа с пользователем, формирование запросов, получение и отображение результатов. В настоящее время существуют развитые средства скоростной разработки систем в такой архитектуре. Одним из наиболее удачных инструментов является BorlandDelphi. Компонентный подход к разработке клиентского места в Delphi существенно ускоряет проектирование всей системы в целом. В Delphi имеются визуальные и невизуальные компоненты. Визуальные компоненты предназначены для проектирования элементов интерфейса, а невизуальные - для сборки из готовых компонентов алгоритмической части, включая запросы, обработку таблиц и т. д.
В отличие от систем в архитектуре файл-сервер, обработка данных в системах с архитектурой клиент-сервер в основном происходит на серверной стороне. Однако клиентское место имеет доступ к метаданным, определяющим структуру таблиц и т. д. Запросы и получение данных в системах с архитектурой клиент-сервер происходят при помощи драйверов данных (в случае Delphi - SQLLinks), которые умеют работать с соответствующими SQL-серверами, посылая запросы, производя подключение, получая результирующие наборы данных.
Приложение динамически генерирует HTML-страницы. Однако, если хочется создавать изысканно выглядящие Internet-приложения, HTML придется освоить. Вы можете создавать свои собственные HTML-компоненты или подправлять внешний вид страниц, генерируемых вашим приложением, расставляя вручную в шаблоне соответствующие теги HyperTextMarkupLanguage.
В случае применения BaikonurWebAppServer между клиентом и сервером появляется дополнительное звено - сервер приложений. Теперь приложения, изготовленные при помощи средства ускоренной разработки (например Delphi), работают не на клиентской стороне, а под управлением сервера приложений Baikonur. В зависимости от необходимого количества одновременно работающих клиентов, таких серверов может быть несколько. SQL-сервер может работать либо на той же машине, где находится сервер приложений, либо быть выделенным в отдельный физический сервер. В случае SQL-сервера от компании Borland это может быть даже сервер, работающий с другой операционной системой, например какой-нибудь из наиболее удачных версий Unix (Solaris, AIX, HP/UX, DigitalUnix, IRIX).
Собственно клиентское место представляет собой теперь компьютер с достаточно произвольно выбираемой конфигурацией и операционной системой. Это может быть и Windows 3.11, и Macintosh, и Unix, и OS/2, и WindowsNT и др. Клиентское место может находиться в сети (стек TCP/IP) или связываться с сервером Baikonur через прямое модемное соединение, через провайдера Internet или по специализированной выделенной линии.
На каждом клиентском рабочем месте устанавливается либо Internet-броузер общего назначения, либо специализированный броузер. При помощи таких броузеров пользователь устанавливает соединение с Web-сервером, запускает одно или несколько приложений на сервере (визуально спроектированных в Delphi), может переключаться между ними, не теряя контекста, может получать оперативную информацию и т. д.
Рассмотрим, как устроена система на основе сервера Baikonur. Удаленные и неудаленные клиенты 1-N обслуживаются одинаковым образом, никаких различий для них не делается. Каждый запрос, поступающий от клиентского броузера на TCP-порт, обслуживается листенером - подзадачей обслуживания коммуникационного порта; этот компонент фактически является монитором соединений (connect), затем запрос попадает на парсер, который его разбирает и идентифицирует клиента. При возникновении соединения листенер инициирует работу IP-менеджера, который обслуживает подзадачи сессий клиентов. Парсер принимает решение, генерировать ли ему новую подзадачу сессии клиента или переключить информационный поток от клиента к его задаче. Таким образом, информационный поток попадает от клиентского броузера именно туда, куда необходимо. Идентификация клиента позволяет избежать потери контекста при переключении между задачами. На передаче информационного потока задаче обработка не заканчивается. Библиотека HTML-компонентов, написанная для Delphi, устроена так, что базовый компонент, присутствующий в каждой задаче (THTMLControl), умеет воспринимать поток информации, передаваемый ему с сервера Baikonur. Этот поток воспринимается и раздается активным визуальным компонентам для обработки. При передаче информации от приложения клиенту все происходит в обратном порядке, с тем лишь исключением, что соединение уже установлено, клиентский броузер идентифицирован. Поэтому остается лишь собрать информацию с визуальных компонентов в один поток и передать обратно клиенту.
Для функционирования системы строится довольно сложная структура. Сложность построения системы усугубляется еще и тем, что обработка всех процессов производится в параллельном режиме, это особенно заметно на многопроцессорных серверах. Все подзадачи Baikonur ведут обработку независимо друг от друга, и, хотя в целом сам сервер получился довольно компактным, логика его функционирования требует отдельного описания.
Для обработки запросов может использоваться параллельно несколько процессов по одному для каждого Web-клиента или один процесс, работающий в многопользовательском режиме. Так как протокол HTTP не ориентирован на сеансы, то Baikonur сам обеспечивает сохранение рабочего контекста пользователя, имитируя сеанс на сервере.
Создание приложений Web к базам данных Oracle
OracleWebServer представляет собой сервер HTTP с возможностью интеграции с базой данных. OracleWebServer получает UniformResourceLocator (URL) с помощью протокола HTTP от навигатора WWW и извлекает информацию, необходимую для ответа на запрос, из базы данных или файловой системы. WebListener - обычный Web-сервер, который получает URL от клиента - навигатора WWW - и отвечает на запрос. При получении URLWebListener определяет, требуется ли для выполнения запроса обращение к файловой системе, выполнение программы через интерфейс CGI или обращение к базе данных. В последнем случае Listener передает запрос диспетчеру многопотокового сервера приложений WebRequestBroker (WRB) и возвращается к состоянию ожидания новых запросов HTTP. Диспетчер WRB распределяет запрос между процессами, называемыми WRBExecutableEngines (WRBX). Каждый из WRBX с помощью встроенного API обращается к специальным приложениям, так называемым WRB-картриджам. WebServer 3.0 позволяет использовать следующие картриджи:
Назад | Содержание | Вперед
[an error occurred while processing this directive]