Учебник по удаленным базам данных

Сервер InterBase

Все серверы имеют похожие принципы организации данных и управления ими. В качестве примера рассмотрим работу с сервером InterBase 6.x, который является "родным" для Delphi. Совместно с Delphi поставляются две части сервера InterBase 6.x: серверная и клиентская. Несмотря на то что сервер InterBase поставляется совместно с Delphi, устанавливается он отдельно: после установки Delphi выдается запрос на установку сервера InterBase. Установка происходит в автоматическом режиме, основные файлы сервера копируются в подкаталог INTERBASE, находящийся в каталоге BORLAND.
Серверная часть InterBase является локальной версией сервера InterBase и используется для отладки приложений, предназначенных для работы с удаленными БД, позволяя на одном компьютере проверить их в сетевом варианте. После отладки на локальном компьютере приложение можно перенести на сетевые компьютеры без изменений, для чего нужно:
1. скопировать БД на сервер;
2. установить для приложения новые параметры соединения с удаленной БД. Скопировать БД можно с помощью программ типа Проводник Windows. Клиентская часть нужна для обеспечения доступа приложения к удаленной БД.

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

Бизнес-правила

Как отмечалось, бизнес-правила представляют собой механизмы управления БД и предназначены для поддержания БД в целостном состоянии. Кроме того, они нужны для реализации ограничений БД, а также для выполнения ряда других действий, например, накапливания статистики работы с БД. Бизнес-правила можно реализовывать на физическом и программном уровнях. В первом случае эти правила (например, ограничение ссылочной целостности для связанных таблиц) задаются при создании таблиц и входят в структуру БД. Для этого в синтаксис инструкции CREATE TABLE включаются соответствующие операнды, например, DEFAULT (значение по умолчанию). В дальнейшей работе нельзя нарушить или обойти ограничение, заданное на физическом уровне. На программном уровне бизнес-правила можно реализовать в сервере и в приложении. Причем эти бизнес-правила не должны быть определены на физическом уровне.
Для реализации бизнес-правил в сервере обычно используются триггеры. Достоинствами такого подхода является то, что вычислительная нагрузка по управлению БД целиком ложится на сервер, что снижает нагрузку на приложение и сеть, а также то, что действие ограничений распространяется на все приложения, осуществляющие доступ к БД. Однако одновременно снижается гибкость управления БД. Кроме того, нужно учитывать, что средства отладки триггеров и хранимых процедур сервера развиты недостаточно хорошо.
Для программирования бизнес-правил в приложении используются компоненты и их средства. Достоинство такого подхода заключается в легкости изменения бизнес-правил и возможности определить правила "своего" приложения. Недостатком является снижение безопасности БД, связанное с тем, что каждое приложение может устанавливать свои правила управления БД.

Организация данных

Информация всей БД сервера InterBase хранится в одном файле с расширением gdb. Размер этого файла может составлять единицы и даже десятки гигабайт. Отметим, что аналогичный размер БД имеет СУБД Microsoft SQL Server, в то время как для более мощных СУБД Oracle и SyBase размер БД достигает десятков и сотен гигабайт.
В отличие от локальной БД, структуру которой составляли таблицы (отдельные или связанные), удаленная БД имеет более сложную структуру, которая включает в свой состав следующие элементы:
1. таблицы;
2. индексы;
3. ограничения;
4. домены;
5. просмотры;
6. генераторы;
7. триггеры;
8. функции пользователя;
9. хранимые процедуры;
10. исключения;
11. BLOB-фильтры;
12. привилегии.

Для InterBase максимальное число таблиц в БД равно 65 536, а максимальное число столбцов в таблице — 1000. Таблицы InterBase имеют меньшее число допустимых типов столбцов (полей), чем таблицы локальных БД Paradox.
В таблицах InterBase отсутствуют такие типы, как логический и автоинкрементный. Логический тип заменяется типом CHAR (1), а вместо автоинкрементного типа для обеспечения уникальных значений используются генераторы и триггеры.

Особенности приложения

Есть основные принципы разработки и использования приложений, выполняющих операции с удаленными БД. Эти принципы являются общими для различных систем, например, таких как InterBase, Microsoft SQL Server или Oracle.
Поэтому примеры программ (приложений) для работы с БД InterBase, которые приводятся ниже, годятся и для других серверов. При разработке приложений использованы компоненты, стандартные для всех БД.
Наряду с этим в Delphi имеется ряд компонентов, предназначенных только для работы с сервером InterBase. Эти компоненты расположены на странице InterBase Палитры компонентов. Многие из них являются аналогами соответствующих компонентов страницы BDE и отличаются тем, что адаптированы специально под InterBase.
Особенность использования данных компонентов заключается в том, что для них доступ к БД осуществляется напрямую через процессор баз данных BDE. При этом нет необходимости в соответствующем драйвере SQL-Links.
Компоненты страницы InterBase принципиально не отличаются от соответствующих компонентов других страниц.

Соединение с базой данных

Для выполнения любых операций с БД с ней необходимо установить соединение, т. е. открыть БД. По завершении работы соединение нужно разорвать, или завершить (закрыть БД). Для соединения с БД программы типа IBConsole имеют соответствующие средства, вызываемые с помощью команд меню. При создании приложения разработчик должен организовывать соединение самостоятельно, для чего Delphi предоставляет соответствующие компоненты, в первую очередь компонент Database.

Технология ADO

Компанией Microsoft был предложен новый механизм доступа к данным — технология ADO (ActiveX Data Objects), построенная на использовании интерфейсов OLE DB. Набор интерфейсов OLE DB присутствует во всех операционных системах компании Microsoft, что делает доступ к данным довольно простым. Приложение, работающее по технологии ADO, может использовать данные, представляющие собой либо таблицы Microsoft Access, либо серверные БД Microsoft SQL, Oracle, либо XML-файлы и т.п.
Технология ADO построена на технологии СОМ, т. е. все объекты и интерфейсы ADO являются объектами и интерфейсами COM.
OLE DB представляет собой набор объектов СОМ, а именно:
1. Command — команда (обычно, SQL-запрос) и механизмы ее выполнения;
2. Data Source Object — хранилище данных;
3. Enumerator — применяется для обеспечения работы провайдеров ADO;
4. Error — информация о возникших исключениях;
5. Rowset — набор данных, являющийся результатом выполнения команды;
6. Session — коллекция объектов, обращающихся к одному и тому же хранилищу данных;
7. Transaction — управление транзакциями в OLE DB.

Для создания приложения, работающего по технологии ADO, компания Borland Предлагает компоненты TADOConnection, TADOCommand, TADODataSet, TADOTable, TADOQuery и TADOStoredProc, расположенные на странице ADO Палитры компонентов Delphi:
1. TADOConnection — аналогичен компоненту TDataBase, служит для соединения с хранилищем данных и работы с транзакциями;
2. TADOTable — таблица, доступ к которой осуществляется средствами ADO;
3. TADOQuery — компонент, отвечающий за запросы к данным;
4. TADOStoredProc — компонент для работы с хранимыми процедурами;
5. TADOCommand и TADODataSet — общие компоненты для работы с технологией ADO, позволяют выполнять команды на языке провайдера данных.

Компонент TADOConnection

Ключевым моментом при работе с технологией ADO является установление соединения с хранилищем данных с помощью провайдера ADO.
Поместив компонент TADOConnection в форму, выберите пункт Edit ConnectionString контекстного меню компонента, чтобы открыть диалоговое окно редактора соединения для создания соединения с провайдером.
Завершив настройку соединения с хранилищем данных, достаточно установить свойство connected типа Boolean в значение True (либо вызвать во время выполнения приложения метод ADOConnection1.open) для того, чтобы сделать соединение активным.
Значение False свойства Connected (либо вызов метода ADoconnection1.close) прекращает соединение с хранилищем данных.

Управление соединением

Компонент TADOConnection располагает методами, удобными для проверки состояния соединения.
Событие Onwiilconnect типа TWillconnectEvent срабатывает перед установкой соединения, указанный тип описан так:
TWillconnectEvent = procedure (Connection: TADOConnection; var ConnectionString, UserlD, Password: WideString;
var ConnectOptions: TConnectOption; var EventStatus: TEventStatus) of object;

Об успешности выполнения запроса на соединение можно узнать, проанализировав значение переменной EventStatus типа Teventstatus. Указанный тип описан так:
TEventStatus =
(esOK, esErrorsOccured, esCantDeny, esCancel, esUnwantedEvent);

Значения типа:
1. esOK (операция выполнена без проблем);
2. esErrorsOccured (ошибка при выполнении операции);
3. esCantDeny (соединение не может быть разорвано);
4. esCancel (соединение разорвано до его открытия);
5. esUnwantedEvent (опредеяет метод, предотвращающий последующую запись события).

Событие Onconnectcompiete типа TConnectErrorEvent срабатывает после установки соединения; указанный тип описан так:
TConnectErrorEvent = procedure(Connection: TADOConnection; Error: Error; var EventStatus: TEventStatus) of object; и Событие onDisconnect типа TDisconnectEvent срабатывает при разрыве соединения; указанный тип описан так:
TDisconnectEvent = procedure(Connection: TADOConnection; var EventStatus: TEventStatus) of object;

При использовании технологии ADO появляется возможность, не имеющая аналогов в BDE. Это синхронное/асинхронное выполнение операций с хранилищем данных. В таком режиме выполняются:
1. установления соединения с хранилищем данных (Connection);
2. выполнение команды (Execute);
3. выборка набора данных (Fetch);.

При помощи свойства connectoptions типа TConnectoption можно задать режим соединения с хранилищем данных. Указанный тип описан так:
TConnectOption = (coConnectUnspecified, coAsyncConnect);

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

Транзакции в ADO

При использовании технологии ADO работа с транзакциями осуществляется с помощью свойств и методов компонента типа TADOConnection.
Свойство Attributes типа TXactAttributes определяет, открывать ли новую транзакцию автоматически, и принимает следующие значения:
1. xaCommitRetaining (при подтверждении предыдущей транзакции начинается новая);
2. xaAbortRetaining (при отмене предыдущей транзакции начинается новая).

Методы:
1. function BeginTrans: Integer; — начинает транзакцию;
2. procedure CommitTrans; — подтверждает транзакцию;
3. procedure RollbackTrans; — откатывает транзакцию.

Компоненты доступа к данным в ADO

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

Свойство LockType типа TADOLockType определяет тип блокировки записей в наборе данных. Указанный тип описан так:
TADOLockType = (ItUnspecified, ItReadOnly, ItPessimistic, ItOptimistic, ItBatchOptimistic);
Значения типа:
1. ItUnspecif led (блокировка определяется источником данных);
2. ItReadOnly (набор данных доступен только для чтения);
3. ItPessimistic (блокировка устанавливается сразу после начала редактирования и действительна до момента подтверждения данных);
4. ItOptimistic (блокировка устанавливается только на период подтверждения изменений);
5. ItBatchOptimistic (аналогично ItOptimistic, но используется при вызове метода UpdateBatch).

Следующее свойство, значение которого необходимо установить перед открытием набора данных, указывает, где будет выполняться работа с набором данных. Это свойство cursorLocation типа TCursorLocation. Здесь указанный тип определен так:
TCursorLocation = (clUseServer,clUseClient);
При значении clUseClient будет обеспечена передача набора данных клиенту, при значении clUseServer курсор будет находиться на сервере, что более разумно при работе с большими наборами данных.

При работе с клиентским курсором необходимо установить свойство Marshaioptions типа TMarshaioption в одно из следующих значений:
1. moMarshalAll (разрешает возвращение данных серверу). Рекомендуется использовать лишь при быстром соединении с хранилищем данных;
2. moMarshalModifiedOnly (возвращение только измененных на стороне клиента записей).

Свойство СursorType типа TCursorType устанавливает тип курсора. Указанный тип описан так:
TCursorType = (ctUnspecified, ctOpenForwardOnly, ctKeyset, ctDynamic, ctStatic);
При использовании клиентского курсора доступно лишь значение ctStatic.

Теперь набор данных может быть открыт либо с помощью свойства Active типа Boolean, либо с помощью вызова метода Open.

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

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

Замечание

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

Узнать о текущем состоянии записи набора данных можно, проанализировав значение свойства Recordstatus типа TrecordstatusSet. Указанный тип описан так:
TRecordStatus = (rsOK, rsNew, rsModified, rsDeleted, rsUnmodifled, rslnvalid, rsMultipleChanges, rsPendingChanges,
rsCanceled, rsCantRelease, rsConcurrencyViolation, rsIntegrityViolation, rsMaxChangesExceeded, rsObjectOpen,
rsOutOfMemory, rsPermissionDenied, rsSchemaViolation, rsDBDeleted);

Сортировка и поиск

В классе TCustomADODataSet реализован простой способ сортировки данных с помощью свойства Sort типа widestring. Поля, участвующие в сортировке, могут быть перечислены через запятую, причем порядок сортировки каждого из полей определяется с помощью ключевых слов ASC (признак прямого порядка сортировки) и/или DESC (признак обратного порядка сортировки).
Пример: ADOQuery1.Sort := 'LastName ASC, DateDue DESC'
По умолчанию принимается прямой порядок сортировки (ASC).

Поиск по полям текущего индекса производится с помощью метода:
function Seek(const KeyValues: Variant; SeekOption: TSeekOption = soFirstEQ): Boolean;

Тип TSeekOption описан следующим образом:
TSeekOption = (soFirstEQ, soLastEQ, soAfterEQ, soAfter, soBeforeEQ, soBefore);

Команды ADO

Для выполнения команды ADO используется специальный компонент TADOCommand, однако в классе TCustomADODataSet реализованы свойства и методы работы с командами.
Свойство command типа TADOCommand предоставляет доступ к объекту команды ADO, а в свою очередь свойство commandType типа TCommandType определяет тип команды. Тип свойства определен так:
TCommandType = (cmdUnknown, cmdText, cmdTable, cmdStoredProc, cmdFile, cmdTableDirect)

Текст команды ADO содержится в свойстве commandText типа widestring. Например, следующий код определяет команду на выполнение SQL-запроса:
with ADODataSetl do
begin
CommandType := cmdText;
CommandText := 'SELECT EmpNo, LastName, FirsName FROM Employee';
Open;
end;

Выполнение команды ADO осуществляется с помощью метода:
function Execute: _Recordset; overload;
function Execute (const Parameters: OleVariant): _Recordset; overload;
function Execute (var RecordsAffected: Integer; const Parameters: OleVariant): _RecordSet; overload;
Здесь параметр Parameters определяет параметры команды; RecordsAffected возвращает общее число обработанных запросом записей.

Свойство ExecuteOptions типа TExecuteOptions задает условия выполнения команды; указанный тип определен так:
TExecuteOption = (eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking, eoExecuteNoRecords);
Значения свойства ExecuteOptions:
1. eoAsyncExecute (асинхронное выполнение команды);
2. eoAsyncFetch (асинхронная передача данных);
3. eoAsyncFetchNonBlocking (асинхронная передача данных без блокирования потока);
4. eoExecuteNoRecords (выполнение команды ADO без возвращения данных).

О текущем состоянии команды можно узнать, проанализировав свойство states типа objectstates. Указанный тип определен так:
TObjectState = (stClosed, stOpen, stConnecting, stExecuting, stFetching);

В заключение, для прервания выполнения команды ADO можно применить метод-процедуру Cancel.
   
назад