2. Создание серверов доступа к данным и клиентских приложений с помощью Entera 3.2 и Delphi 3/C++Builder 3 Enterprise

В типичных информационных системах с использованием Entera обычно имеется три звена:

  1. Сервер баз данных
  2. Среднее звено, содержащее бизнес-правила, определяющие, каким образом можно получить данные, требующиеся приложению. Приложение, использующее эти данные, обращается к ним посредством Entera. В некоторых случаях правила могут быть сосредоточены в исполняемом файле, называемом сервером функциональности (functionality server), и этот сервер может обращаться к другому приложению среднего звена, поставляющему данные с сервера. Приложений среднего звена может быть несколько в зависимости от потребностей.
  3. Презентационный слой - та часть информационной системы, которая создается с помощью Delphi или C++Builder. Приложение презентационного слоя запрашивает данные у приложения среднего звена и представляет их пользователю в виде, удобном для просмота и редактирования.

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

Наряду с версией Delphi и C++Builder Client/Server Suite имеются версии Delphi и C++Builder Enterprise, позволяющие создавать "тонкие" клиентские приложения для сервера приложений Inprise Entera c помощью компонентов TEnteraConnection и TEnteraProvider. Использование этих средств разработки будет рассмотрено далее.

В качестве примера рассмотрим использование Entera для Windows NT (использование Entera для Unix требует примерно тех же приемов).

2.1. Конфигурация и запуск Entera Broker

Для создания сервера следует в первую очередь запустить Entera Broker. Типичный командный файл для запуска брокера выглядит следующим образом: start "Entera Broker" broker -e broker.env

Команда start предназначена для создания процесса, в котором будет выполняться брокер. "Entera Broker" - заголовок окна, созданного командой start. Третий параметр - имя исполняемого файла broker.exe из каталога Entera\TCP. Параметр -e означает использование файла конфигурации, имя которого указано в последнем параметре команды. Этот файл имеет примерно следующий вид:

DCE_BROKER=elmanova,
16000 DCE_LOG=CLIENT.LOG>
DCE_DEBUGLEVEL=D,D

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

Для успешного запуска брокера следует иметь в одном каталоге файлы broker.env, broker.exe, clistart.exe (надстройка над ODBC, обеспечивающая доступ к данным и фактически представляющая собой собственно сам сервер доступа к данным), и odet30.dll (библиотека, содержащая функции Entera API для Windows NT). Иногда бывает нужно, чтобы переменная окружения ODEDIR указывала на каталог Entera\TCP:

Set ODEDIR=D:\OpenEnv\Entera\Tcp

Окно запущенного брокера представляет собой стандартное окно 32-разрядного консольного приложения.

Отметим, что, если используется Entera 3.2 для Windows NT, брокер должен выполняться под управлением именно Windows NT; если используется Entera 3.2 для другой платформы - все выполненные выше действия следует выполнить для этой платформы (отличия здесь невелики, так как в основном здесь используются обычные команды операционной системы для установки значений переменных среды и запуска приложений). Например, в случае UNIX все команды можно выполнить в терминальном режиме или внутри терминального окна, если используется какая-нибудь графическая среда.

2.2. Конфигурация источника данных и сервера

Теперь можно приступить к созданию сервера доступа к данным. Сразу же отметим, что этот сервер не обязан находиться на том же самом компьютере, где запущен брокер; кроме того, данный сервер может выполняться под управлением Windows 95/98, что неоднократно проверено экспериментально.

В качестве источника данных используем каталог DBDEMOS или BCDEMOS, описав его в Control Panel как ODBC-источник типа dBase 5 с именем edemo.

Если такого каталога данный компьютер не содержит, может подойти любой другой ODBC-источник. Отметим, что компьютер, содержащий сервер доступа к данным, вовсе не обязан содержать Delphi, С++Builder или иное средство разработки. В принципе он может управляться операционной системой, отличной от Windows, и в этом случае может потребоваться по-другому конфигурировать доступ к данным (например, настроив соответствующим образом клиентскую часть какой-либо серверной СУБД).

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

Создадим простейший пример такого скрипта для таблицы Animals.dbf из каталога DBDEMOS:

select_animals:
SELECT NAME,SIZE,WEIGHT,AREA FROM ANIMALS; 


insert_animals:
INSERT INTO ANIMALS (NAME,SIZE,WEIGHT,AREA) 
VALUES($NAME[CHAR],$SIZE[DOUBLE],$WEIGHT[DOUBLE],$AREA[CHAR]); 
delete_animals:

DELETE FROM ANIMALS
WHERE NAME='$NAME';
  
update_animals: 
UPDATE ANIMALS SET NAME= '$NAME', SIZE='$SIZE', WEIGHT='$WEIGHT',
AREA= '$AREA'
WHERE NAME='$NAME'; 

Теперь можно создать командный файл для превращения SQL-скрипта в сервер функциональности и загрузить последний в оперативную память.

SET DB_LOGIN= 
SET DB_PWD= 
start "Demo server" clistart -d edemo -s demo -e server.env -q anim.sql

Первые две строки устанавливают переменные среды, проверяемые сервером баз данных. В третьей строке с помощью команды start в окне с именем "Demo server" запускается утилита clistart - сервер доступа к данным, использующий ODBC-сервисы. Параметр этой утилиты -d указывает на имя ODBC-исчточника, созданного ранее. Параметр -s присваивает серверу имя demo. Параметр -e указывает на имя файла конфигурации. Параметр -q указывает на имя SQL-скрипта.

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

DCE_BROKER=elmanova,
16000 DCE_LOG=SERVER.LOG
DCE_DEBUGLEVEL=D,D

В первой строке этого файла указывается, где выполняется брокер.

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

Окно сервера представляет также собой стандартное окно запущенного 32-разрядного консольного приложения.

Отметим, что при использовании другого способа доступа к данным следует для создания сервера использовать соответствующую надстройку над клиентской частью серверной СУБД. Например, в случае доступа к Oracle такая надстройка называется orastart.exe, и в качестве параметра -d в этом случае указывается имя TNS-псевдонима соответствующей базы данных.

При создании сервера доступа к данным на платформе, отличной от Windows, следует использовать соответствующие версии утилит типа orastart. Команды и командные файлы также должны быть приведены в соответствие правилам используемой операционной системы. Выполнять их можно также в терминальном режиме или в терминальном окне - сервер доступа к данным не обладает пользовательским интерфейсом (но может создавать log-файлы, что обычно и используется).

2.3. Создание клиентского приложения с помощью Delphi или C++Builder Enterprise

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

Запустим Delphi 3 Enterprise (или C++Builder 3 Enterpise) и создадим новое приложение. На главной форме приложения поместим компоненты TEnteraConnection, TEnteraProvider, TClientDataset, TDataSource, TDBGrid и TDBNavigator. Установим свойство SQLFile компонента TEnteraConnection равным имени SQL-скрипта (его следует скопировать на компьютер, где будет функционировать клиент). Установим свойство ConfigFile этого же компонента равным имени файла окружения:

DCE_BROKER=elmanova,
16000 DCE_LOG=client1.LOG
DCE_DEBUGLEVEL=D,D 

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

Свойство TransportName компонента TEnteraConnection должно быть установлено равным tmTCP. Cвойство ServerName должно содержать имя сервера (значение параметра -s).

Рис. 2. Свойства компонента TEnteraConnection.

Далее свойство Server компонента TEnteraProvider следует установить равным имени компонента TEnteraConnection. После этого следует выбрать из выпадающих списков значения свойств SelectRPC, InsertRPC, DeleteRPC, UpdateRPC.

Рис. 3. Свойства компонента TEnteraProvider.

Далее следует установить свойство Provider компонента TClientDataSet равным имени компонента TEnteraProvider. Свойство RemoteServer следует оставить пустым (в отличие от случая использования этого компонента с серверами, управляемыми MIDAS).

Теперь можно установить свойство Active этого компонента равным true и связать его с источником данных и интерфейсными элементами формы (рис.3.5 )

Рис. 4. Главная форма клиентского приложения.

Теперь можно сохранить проект, скомпилировать и запустить его.

2.4. Передача параметров на сервер

Предположим, нам нужно выполнить параметризованный запрос:

 select_animals: 
 SELECT NAME,SIZE,WEIGHT,AREA FROM ANIMALS
 WHERE NAME=$NAME[CHARACTER];

Внесем соответствующие изменения в SQL-скрипт и перезапустим сервер.

Если теперь в клиентском приложении раскрыть список подсвойств SelectRPC компонента TEnteraProvider и выбрать подсвойство Params, можно просмотреть список всех параметров запроса и обнаружить, что параметр NAME изменил значение своего свойства ParamType на ptInput.

Рис. 5. Вложенные подсвойства свойства SelectRPC компонента TEnteraProvider.

Рис. 6. Свойства параметра NAME запроса SelectRPC.

Модифицируем клиентское приложение, добавив компонент TEdit и кнопку.

Добавим обработчик события, связанный с нажатием на эту кнопку: Код для С++Builder при этом будет выглядеть так:

 void __fastcall TForm1::Button1Click(TObject *Sender )
{
ClientDataSet1->Close(); EnteraProvider1->SelectRPC>
Params>Items[0]>Value=Edit1>Text; 
ClientDataSet1>Open();

}

Соответствующий код для Delphi выглядит так:

procedure TForm1.Button1Click(Sender: TObject); 
begin
ClientDataSet1.Close; 
EnteraProvider1.SelectRPC.Params[0].Value:=Edit1.Text; 
ClientDataSet1.Open; <
end; 

Теперь можно сохранить, скомпилировать и запустить клиентское приложение:

Рис. 7. Клиентское приложение после выполнения параметризованного запроса

Отметим, что создание сервера доступа к данным с использованием стандарта DCE (Distributed Computing Environment), предоставляющего доступ к данным, и клиентского приложения с помощью Delphi/C++Builder Enterprise мало чем отличается от создания сервера и клиента с использованием непосредственного доступа с помощью TCP/IP.

Для создания DCE-сервера следует иметь DCE-версии файлов clistart.exe (или orastart.exe и т.д.) и odet30.dll. Следует также позаботиться о корректных значениях переменных окружения ODEDIR и PATH:

SET ODEDIR=C:\OPENENV\ENTERA\DCE
PATH=%ODEDIR%\BIN;%PATH% 

Файл конфигурации в данном случае имеет расширение DAP (Distributed Application Profile) и имеет примерно следующий вид:

 [DCEApp]
  Broker=ncan_in_tcp:elmanova[]
  LogFile=client.log 
  LogLevel=3 

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

Перед запуском сервера следует запустить брокер:

SET ODEDIR=C:\OPENENV\ENTERA\DCE 
PATH=%ODEDIR%\BIN;%PATH% 
start "Entera Broker" brk 

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

start clistart -d edemo -e server.dap -q anim.sql

(в случае использования ODBC-источника данных) или

start orastart -d TEST1 -e server.dap -q ora1.sql

(в случае использования ORACLE)

Создание DCE-клиента с помощью Delphi/C++Builder Enterprise практически не отличается от создания TCP-клиента. Основные отличия заключаются в другом значении свойства TransportMode компонента TEnteraConnection - оно должно быть равно tmDCE, и в выборе другого имени конфигурационного файла (сlient.dap), имеющего примерно следующий вид:

[DCEApp]
Broker=ncan_in_tcp:ws13[]
LogFile=dbserv.log 
LogLevel=3  

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

Как протестировать работу брокера и убедиться, что при наличии нескольких серверов в сети подключение клиентов к ним производится случайным образом (что позволяет осуществить баланс загрузки серверов)? Самый простой тест может заключаться в использовании доступа к каким-либо локальным таблицам с помощью серверов доступа к данным (например, той же самой таблицы Animals.dbf). Если в локальных версиях этих таблиц, содержащихся на разных компьютерах, где имеются серверы функциональности, будут содержаться разные данные, каждый раз при запуске клиентского приложения в интерфейсных элементах формы будут также отображаться разные данные. Можно также поместить на форму клиентского приложения какой-нибудь интерфейсный элемент, осуществляющий установку и разрыв соединения с сервером, чтобы не перезапускать клиентское приложение.

Рис. 8. Использование Entera Broker

В заключение отметим, что создание клиентских приложений может быть осуществлено не только с помощью Delphi/C++Builder Enterprise, но и с помощью многих других средств разработки, в том числе 16-разрядных (например, SQL Windows, Visual Basic, Delphi 1.0 или Delphi 2.0 Desktop). В этом случае следует использовать для соответствующего языка программирования генератор stub-кода, содержащего вызовы удаленных процедур, связанные с выполнением SQL-запросов (он входит в комплект поставки Entera и называется Object Interface Generator), и затем встраивать сгенерированный код в клиентское приложение, то есть использовать стандартные методы создания клиентских приложений, рассмотренные в следующем разделе. Компоненты TEnteraConnection и TEnetraProvider фактически просто реализуют функциональность, которая в ином случае содержалась бы в сгенерированном stub-коде.

Назад | Содержание | Вперед