Ранее были рассмотрены локальные базы данных, когда и БД, и взаимодействующее с ней приложение располагаются на одном компьютере. В данной главе мы рассмотрим некоторые особенности работы с удаленными БД, используемыми в сети, где приложение и БД располагаются на разных компьютерах.
Основные понятия
В принципе локальную БД тоже можно использовать для коллективного доступа, т. е. в сетевом варианте. В этом случае файлы базы данных и приложение для работы с ней располагаются на сервере сети. Пользователь запускает со своего компьютера находящееся на сервере приложение, при этом у него запускается копия приложения. Можно установить приложение и непосредственно на компьютере пользователя, в этом случае приложению должно быть известно местонахождение общей БД, заданное, например, через псевдоним. Подобный сетевой вариант использования локальной БД соответствует архитектуре "файл-сервер".
Достоинствами сетевой архитектуры "файл-сервер" являются простота разработки и эксплуатации БД и приложения. Разработчик фактически создает локальную БД и приложение, которые затем просто используются в сетевом варианте. При этом не требуется дополнительное программное обеспечение для организации работы с БД.
Однако архитектуре "файл-сервер" свойственны и существенные недостатки.
□ Для работы с данными используется навигационный способ доступа, при этом по сети циркулируют большие объемы данных. В результате сеть оказывается перегруженной, что является причиной ее низкого быстродействия и плохой производительности при работе с БД.
□ Требуется синхронизация работы отдельных пользователей, связанная с блокировкой в таблицах тех записей, которые редактирует другой пользователь.
□ Приложения не только обрабатывают данные, но и управляют самой базой данных. В связи с тем, что управление БД осуществляется с разных компьютеров, затрудняются управление доступом, соблюдение конфиденциальности и поддержание целостности БД.
358
Часть III. Удаленные базы данных
Из-за этих недостатков архитектура "файл-сервер", как правило, используется в небольших сетях. Для сетей с большим количеством пользователей предпочтительным вариантом (а порой и единственным возможным) является архитектура "клиент- сервер".
Архитектура "клиент-сервер"
В сетевой архитектуре "клиент-сервер" БД размещается на компьютере-сервере сети (сервере или удаленном сервере) и называется также удаленной БД. Приложение, осуществляющее работу с этой БД, находится на компьютере пользователя. Приложение пользователя является клиентом, его также называют приложением-клиентом.
Клиент и сервер взаимодействуют следующим образом. Клиент формирует и отсылает запрос (SQL-запрос) серверу, на котором размещена БД. Сервер выполняет запрос и выдает клиенту в качестве результатов требуемые данные.
Таким образом, в архитектуре "клиент-сервер" клиент посылает запрос и получает только те данные, которые ему действительно нужны. Вся обработка запроса выполняется на удаленном сервере. К достоинствам такой архитектуры относятся следующие факторы.
□ Для работы с данными используется реляционный способ доступа, что снижает нагрузку на сеть.
□ Приложения не управляют напрямую базой, управлением занимается только сервер. В связи с этим можно обеспечить высокую степень защиты данных.
□ В приложении отсутствует код, связанный с управлением БД, поэтому приложения упрощаются.
Отметим, что сервером называют не только компьютер, но и специальную программу, которая управляет БД. Так как в основе организации обмена данными между клиентом и сервером лежит язык SQL, такую программу еще называют SQL-сервером, а БД — базой данных SQL. В широком смысле слова под сервером понимают компьютер, программу и саму базу данных. SQL-серверами являются промышленные СУБД, такие как InterBase, Oracle, Informix, SyBase, DB2, Microsoft SQL Server и др. Каждый из серверов имеет свои преимущества и особенности, связанные, например, со структурой БД и реализацией языка SQL, которые необходимо учитывать при разработке приложения. Далее мы будем понимать под сервером программу (т. е. SQL-сервер), а установленную на компьютере-сервере базу данных будем называть удаленной БД.
При работе в архитектуре "клиент-сервер" приложение должно:
□ устанавливать соединение с сервером и завершать его;
□ формировать и отсылать запрос серверу, получая от него результаты выполнения запроса;
□ обрабатывать полученные данные.
При этом обработка данных не имеет принципиальных отличий по сравнению с обработкой данных в локальных БД.
Глава 13. Введение в работу с удаленными базами данных
359
Сервер и удаленная БД
Удаленная БД, как и локальная, представляет собой совокупность взаимосвязанных таблиц. Однако данные этих таблиц, как правило, содержатся в одном общем файле. Как и в случае с локальной БД, для таблиц удаленной БД могут устанавливаться связи (отношения), ограничения ссылочной целостности, ограничения на значения столбцов и т. д.
(_____ ЗамечаниеJ
Для удаленных БД поле называется столбцом.
Для управления БД сервер использует:
□ триггеры;
□ генераторы;
□ хранимые процедуры;
□ функции, определяемые пользователем;
□ механизм транзакций;
□ механизм каптированных изменений;
□ механизм событий.
Многие из перечисленных элементов обеспечиваются возможностями языка SQL-сервера, в котором, по сравнению с локальной версией, имеются существенные особенности, рассматриваемые ниже.
Средства работы с удаленными БД
Система Delphi обеспечивает разработку приложений для различных серверов, предоставляя для этого соответствующие средства. Отметим, что многие описанные ранее принципы разработки приложений и средства для работы с локальными БД относятся и к работе с удаленными БД. В частности, для разработки приложений используются такие компоненты, как источник данных DataSource, наборы данных Table, ADOTable, SQLTable, IBTable, Query, ADOQuery И SQLQuery, Сетка DBGrid И Др.
СЗамечание ^
Для реализации реляционного способа доступа к удаленной БД с помощью BDE необходимо использовать только средства языка SQL. Поэтому в качестве компонентов должны выбираться такие как Query, StoredProc или UpdateSQL. Кроме того, для набора данных нельзя использовать методы, характерные для навигационного способа доступа, например, Next и Previous для перемещения текущего указателя или Edit, Insert, Append или Delete для изменения записей.
360
Часть III. Удаленные базы данных
Напомним, что если при выполнении модифицирующего БД запроса с помощью компонента Query не нужен результирующий набор данных, то этот запрос предпочтительнее выполнять с помощью метода ExecSQL. Например:
Queryl.Close;
Queryl.SQL.Clear;
Queryl.SQL.Add('DELETE FROM Personnel WHERE Position = 'Менеджер');
Queryl.ExecSQL;
Для работы с таблицами и запросами по-прежнему можно использовать такие программы, как Database Desktop и SQL Explorer.
Средства Delphi, предназначенные для работы с удаленными БД, можно разделить на два вида:
□ инструменты; □ компоненты.
К инструментам относятся специальные программы и пакеты, обеспечивающие обслуживание БД вне разрабатываемых приложений. Среди них:
□ InterBase Server Manager — программа управления запуском сервера InterBase;
□ IBConsole — консоль сервера InterBase;
□ SQL Monitor — программа отслеживания порядка выполнения SQL-запросов
к удаленным БД.
Компоненты предназначены для создания приложений, выполняющих операции с удаленной БД. Перечислим наиболее важные из них:
□ Database (соединение с БД);
□ session (текущий сеанс работы с БД);
□ storedProc (вызов хранимой процедуры);
□ updateSQL (модификация набора данных, основанного на SQL-запросе);
□ DCOMConnection (DCOM-соединение);
□ компоненты страниц ADO, dbExpress и InterBase Палитры компонентов.
Отметим, что многие из названных компонентов, например, Database, UpdateSQL и Session, используются также при работе с локальными БД. Так, компонент Database позволяет реализовать механизм транзакций, как было показано в главе 7, посвященной навигационному способу доступа к данным с помощью механизма BDE. Однако наиболее часто эти компоненты применяются именно при работе с удаленными базами.
Часть компонентов, например, клиентский набор данных ciientDataSet и соединение с сервером DCOMConnection, предназначена для работы в трехуровневой (трехзвенной) архитектуре "клиент-сервер" ("тонкий" клиент) и используется для построения сервера приложений.
В основе операций, выполняемых с удаленными БД как с помощью инструментов, так и программно, лежит язык SQL. Например, при создании таблицы с
Глава 13. Введение в работу с удаленными базами данных
361
помощью программы IBConsole (в ее окне Interactive SQL) необходимо набрать и выполнить SQL-запрос (инструкцию) create table. Если создание таблицы с помощью механизма BDE осуществляется из приложения пользователя, то для этой цели используется набор данных Query, который выполняет такой же запрос. Основное различие заключается в том, каким образом выполняется SQL-запрос к удаленной БД.
Итак, для удаленных БД разница между средствами, используемыми в приложении, и инструментами намного меньше, чем для локальных баз данных. Поэтому далее для удаленных БД использование инструментов (на примере программы IBConsole) и создание приложений рассматриваются параллельно.
Сервер InterBase
Все серверы имеют похожие принципы организации данных и управления ими. В качестве примера рассмотрим работу с сервером InterBase 6.x, который является "родным" для Delphi. Совместно с Delphi поставляются две части сервера InterBase 6.x: серверная и клиентская. Несмотря на то что сервер InterBase поставляется совместно с Delphi, устанавливается он отдельно: после установки Delphi выдается запрос на установку сервера InterBase. Установка происходит в автоматическом режиме, основные файлы сервера копируются в подкаталог INTERBASE, находящийся в каталоге BORLAND. Отметим, что бесплатная пробная (trial) версия сервера доступна по адресу www.borland.com/interbase.
Серверная часть InterBase является локальной версией сервера InterBase и используется для отладки приложений, предназначенных для работы с удаленными БД, позволяя на одном компьютере проверить их в сетевом варианте. После отладки на локальном компьютере приложение можно перенести на сетевые компьютеры без изменений, для чего нужно:
□ скопировать БД на сервер;
□ установить для приложения новые параметры соединения с удаленной БД.
Скопировать БД можно с помощью программ типа Проводник Windows.
Клиентская часть нужна для обеспечения доступа приложения к удаленной БД.
При разработке БД и приложений с использованием локальной версии сервера InterBase нужно иметь в виду, что она имеет ряд ограничений и может не поддерживать, например, механизм событий сервера или определяемые пользователем функции. Полнофункциональная версия сервера InterBase приобретается и устанавливается отдельно от Delphi.
Как упоминалось, в основе работы с удаленной БД лежат возможности языка SQL, обеспечивающие соответствующие операции. Назначение и возможности языка SQL для удаленных БД в принципе совпадают с назначением и возможностями этого языка для локальных БД. Ниже мы рассмотрим особенности языка SQL для удаленных БД.
362
Часть III. Удаленные базы данных
При рассмотрении инструкций языка будем опускать несущественные операнды и элементы. При описании формата инструкций языка SQL используются следующие правила:
□ символы < и > обозначают отдельные элементы формата инструкций, например, имена таблиц и столбцов, и при записи инструкций SQL не указываются;
□ в квадратные скобки заключаются необязательные элементы конструкций языка;
□ элементы списка, из которого при программировании можно выбрать любой из этих элементов, разделяются знаком |, а сам список заключается в фигурные скобки.
Для наглядности зарезервированные слова языка SQL будем писать заглавными (прописными) буквами, а имена — строчными (маленькими). Регистр букв не влияет на интерпретацию инструкций языка.
Бизнес-правила
Как отмечалось, бизнес-правила представляют собой механизмы управления БД и предназначены для поддержания БД в целостном состоянии. Кроме того, они нужны для реализации ограничений БД, а также для выполнения ряда других действий, например, накапливания статистики работы с БД.
Бизнес-правила можно реализовывать на физическом и программном уровнях. В первом случае эти правила (например, ограничение ссылочной целостности для связанных таблиц) задаются при создании таблиц и входят в структуру БД. Для этого в синтаксис инструкции create table включаются соответствующие операнды, например, default (значение по умолчанию). В дальнейшей работе нельзя нарушить или обойти ограничение, заданное на физическом уровне.
На программном уровне бизнес-правила можно реализовать в сервере и в приложении. Причем эти бизнес-правила не должны быть определены на физическом уровне. Для реализации бизнес-правил в сервере обычно используются триггеры. Достоинствами такого подхода является то, что вычислительная нагрузка по управлению БД целиком ложится на сервер, что снижает нагрузку на приложение и сеть, а также то, что действие ограничений распространяется на все приложения, осуществляющие доступ к БД. Однако одновременно снижается гибкость управления БД. Кроме того, нужно учитывать, что средства отладки триггеров и хранимых процедур сервера развиты недостаточно хорошо.
Для программирования бизнес-правил в приложении используются компоненты и их средства. Достоинство такого подхода заключается в легкости изменения бизнес-правил и возможности определить правила "своего" приложения. Недостатком является снижение безопасности БД, связанное с тем, что каждое приложение может устанавливать свои правила управления БД. В главе 7, посвященной навигационному способу доступа, мы рассмотрели программирование бизнес-правил в приложении на примере каскадного удаления записей в связанных локальных таблицах.
Глава 13. Введение в работу с удаленными базами данных
363
Организация данных
Информация всей БД сервера InterBase хранится в одном файле с расширением gdb. Размер этого файла может составлять единицы и даже десятки гигабайт. Отметим, что аналогичный размер БД имеет СУБД Microsoft SQL Server, в то время как для более мощных СУБД Oracle и SyBase размер БД достигает десятков и сотен гигабайт.
□ таблицы; □ индексы; □ ограничения; □ домены; □ просмотры; □ генераторы; |
В отличие от локальной БД, структуру которой составляли таблицы (отдельные или связанные), удаленная БД имеет более сложную структуру, которая включает в свой состав следующие элементы:
□ триггеры;
□ функции пользователя;
□ хранимые процедуры;
□ исключения;
□ BLOB-фильтры;
□ привилегии.
Элементы структуры удаленной БД также называют метаданными. Слово "мета" имеет смысл "над", т. е. метаданные представляют собой данные, которые описывают структуру БД.
Для InterBase максимальное число таблиц в БД равно 65 536, а максимальное число столбцов в таблице — 1000. Отметим, что таблицы InterBase имеют меньшее число допустимых типов столбцов (полей), чем таблицы локальных БД Paradox. Типы столбцов базы InterBase приведены в табл. 13.1.
Таблица 13.1. Типы столбцов таблиц InterBase
364
Часть III. Удаленные базы данных
В таблицах InterBase отсутствуют такие типы, как логический и автоинкрементный. Логический тип заменяется типом char (1), а вместо автоинкрементного типа для обеспечения уникальных значений используются генераторы и триггеры.
Запуск сервера
Для запуска сервера предназначена программа InterBase Server Manager (рис. 13.1), вызываемая одноименной командой главного меню Windows или через Панель управления. Функции управления сервером InterBase, например, управление подключением к серверу пользователей и просмотр информации о БД, в последних версиях Delphi реализует программа IBConsole.
Состояние сервера выводится в панели Status: запущенному состоянию сервера соответствует надпись Running, остановленному — Stopped.
Сервер InterBase может запускаться автоматически или в ручном режиме, чем управляют переключатели группы Start Mode (Режим запуска). Если выбран переключатель Automatic, то сервер будет автоматически вызываться при каждом запуске (перезапуске) Windows. Если же выбран ручной запуск (Manual), то сервер запускается нажатием кнопки Start. После запуска сервера кнопка Start изменяет свое название на Stop, и ее повторное нажатие приводит к остановке сервера.
В Windows NT сервер можно запустить как службу (service). Установленный флажок Run the InterBase server as a service on Windows NT указывает, что сервер InterBase запускается как служба Windows NT.
Глава 13. Введение в работу с удаленными базами данных
365
Панель Root Directory показывает главный каталог, в котором установлен сервер InterBase и который можно изменить, нажав кнопку Change и выбрав нужный каталог. Однако на практике изменять главный каталог не требуется.
Завершить работу сервера также можно, открыв щелчком мыши на значке контекстное меню и выбрав команду Shutdown.
При запущенном сервере с помощью кнопок Server Properties (Свойства сервера) и Guardian Properties (Свойства безопасности) открываются диалоговые окна настройки соответствующих свойств. Обычно в них уже заданы нужные значения, изменять которые нет необходимости.
При запуске сервера в качестве службы Windows NT управлять его параметрами, а также остановить сервер можно в окне Services.
Особенности приложения
Есть основные принципы разработки и использования приложений, выполняющих операции с удаленными БД. Эти принципы являются общими для различных систем, например, таких как InterBase, Microsoft SQL Server или Oracle. Поэтому примеры программ (приложений) для работы с БД InterBase, которые приводятся ниже, годятся и для других серверов. При разработке приложений использованы компоненты, стандартные для всех БД.
Наряду с этим в Delphi имеется ряд компонентов, предназначенных только для работы с сервером InterBase. Эти компоненты расположены на странице InterBase Палитры компонентов. Многие из них являются аналогами соответствующих компонентов страницы BDE и отличаются тем, что адаптированы специально под InterBase.
Особенность использования данных компонентов заключается в том, что для них доступ к БД осуществляется напрямую через процессор баз данных BDE. При этом нет необходимости в соответствующем драйвере SQL-Links.
Компоненты страницы InterBase принципиально не отличаются от соответствующих компонентов других страниц, поэтому здесь они описаны кратко.
Соединение с базой данных
Для выполнения любых операций с БД с ней необходимо установить соединение, т. е. открыть БД. По завершении работы соединение нужно разорвать, или завершить (закрыть БД). Для соединения с БД программы типа IBConsole имеют соответствующие средства, вызываемые с помощью команд меню. При создании приложения разработчик должен организовывать соединение самостоятельно, для чего Delphi предоставляет соответствующие компоненты, в первую очередь компонент Database.
Рассмотрим, как установить соединение с удаленной БД с помощью программы IBConsole и компонентов Delphi, поддерживающих механизм доступа BDE.
366 Часть III. Удаленные базы данных
Соединение с базой из программы IBConsole
Перед установлением соединения с БД нужно с помощью команд Server\Register и Server\Login выполнить регистрацию сервера InetrBase, а также задать имя и пароль пользователя.
(_____ ЗамечаниеJ
Заметим, что первоначально на сервере InetrBase для пользователей есть стандартное имя SYSDBA и пароль "masterkey", которые могут изменяться администратором.
Соединение с БД выполняется командой Database\Connect. После открытия БД доступна для работы, например, для изменений структуры путем добавления и удаления таблиц или для редактирования данных.
Для отключения от БД следует выполнить команду Database\Disconnect, при этом запрашивается подтверждение на выполнение этой операции. При утвердительном ответе соединение с БД разрывается. При необходимости также запрашивается подтверждение текущей незавершенной транзакции.
На программном уровне соединение с БД выполняет инструкция conn(ct, имеющая следующий формат:
CONN(CT DATABA6("<Имя файла БД>"
86(5 "<Имя пользователя^' PASSWORD "<Пароль пользователя^'
Отключение от БД выполняет инструкция exit.
Компонент Database
Компонент Database служит для соединения с БД. Если программист при разработке приложения не разместил в форме компонент Database, то для организации соединения с БД в процессе выполнения приложения будет создаваться динамический (временный) объект типа TDatabase. Динамическое создание этого объекта выгодно тем, что не требует от программиста каких-либо действий. Однако при использовании динамического объекта типа TDatabase он автоматически создается для каждого соединения с БД, что при одновременной работе с несколькими БД требует больших ресурсов Windows, чем в случае применения компонента Database.
Использование компонента Database позволяет:
□ настраивать параметры соединения с БД;
□ явно управлять транзакциями при работе с БД.
Компонент Database можно использовать для локальных и для удаленных БД. Например, действия, связанные с настройкой псевдонимов BDE, одинаковы для обоих типов БД.
Свойство sessionName типа string указывает компонент сеанса session, с которым связан компонент Database. Если значение этого свойства не задано
Глава 13. Введение в работу с удаленными базами данных
367
(пустое значение или значение Default), то для сеанса создается динамический объект типа TSession (объект по умолчанию).
Свойство AliasName типа string указывает псевдоним БД. На этапе разработки приложения псевдоним выбирается из списка в окне Инспектора объектов.
Расположение БД может быть определено также с помощью свойства DriverName типа string, задающего драйвер БД. Следует иметь в виду, что значения этого свойства и свойства AliasName являются взаимоисключающими: при установке одного из них второе автоматически сбрасывается. Если расположение БД задано значением свойства DriverName, то остальные параметры соединения должны быть заданы через свойство Params.
Свойство DatabaseName типа string задает имя БД, используемое в приложении для соединения с БД. Отметим, что это имя не совпадает ни с псевдонимом, ни с собственно именем БД (именем главного ее файла). Имя БД, заданное свойством DatabaseName, действует только в приложении и только для организации подключения к БД, указанной ее псевдонимом.
Впоследствии набор данных (обычно Query) связывается с БД через свойство DatabaseName, значение которого должно совпадать со значением одноименного свойства компонента Database, используемого для соединения. На этапе разработки приложения имя БД для набора данных выбирается в окне Инспектора объектов в списке, содержащем его наряду с псевдонимами BDE.
Свойство Params типа TStrings определяет параметры соединения, для изменения которых при разработке приложения используется редактор списка значений Value List editor, вызываемый двойным щелчком в области значения Инспектора объектов. С его помощью можно (неясно, почему) установить значение одного параметра: в поле Key указывается имя параметра, а в поле Value указывается значение параметра.
Нажатие кнопки Code Editor преобразует список к текстовому виду и отображает его на отдельной вкладке в окне редактора кода (рис. 13.2). В окне редактора кода можно задавать и редактировать произвольное число параметров. Более того, теперь при двойном щелчке в области значения свойства Params Инспектора объектов всегда происходит вызов редактора кода, а не редактора Value List editor.
368
Часть III. Удаленные базы данных
В приведенном на рис. 13.2 примере указаны имя сервера, имя пользователя и его пароль. Отметим, что имя сервера лучше задавать через псевдоним, что облегчает перенос БД на другое место.
При выполнении приложения доступ к отдельному параметру осуществляется по его индексу в массиве (списке) параметров Params. При этом необходимо учитывать, что в значение параметра также входит его название. Рассмотрим следующий пример:
procedure TForml.ButtonlClick(Sender: TObject);
begin
Editl.text:= Database1.Params[1];
end;
Здесь при нажатии кнопки в поле редактирования (компонент Edit) выводится второй параметр соединения.
В частности, для параметров, приведенных на рис. 13.2, будет получена следующая строка:
USER NAME = SYSDBA
Кроме параметров, заданных в свойстве Params компонента Database, соединение с БД также определяется:
□ установками системных параметров BDE;
□ параметрами драйвера, используемого для доступа к БД;
□ параметрами псевдонима БД.
Если в списке Params какой-либо параметр, например, langdriver, не задан, он выбирается из перечисленных выше установок. Поэтому с помощью свойства Params нужно устанавливать (переустанавливать) только те параметры, значения которых не устраивают разработчика.
Свойство LoginPrompt типа Boolean управляет режимом отображения окна ввода имени пользователя и пароля Database Login (рис. 13.3). По умолчанию свойство имеет значение True, и окно появляется при первом соединении с БД. Если установить свойство LoginPrompt в значение False, то запрос на идентификацию пользователя не выдается, и его имя и пароль должны быть указаны в параметрах соединения (свойство Params).
Свойство KeepConnection типа Boolean определяет, сохранять ли соединение с БД, если с ней не связан ни один набор данных. По умолчанию свойство имеет значение True, и однократно установленное соединение сохраняется в течение всей работы с БД. Использование постоянного соединения с БД экономит время, затрачиваемое на доступ к данным, но требует определенных системных затрат на его поддержание. Постоянное соединение разрывается при окончании работы приложения или при программной установке свойства connected в значение False.
Глава 13. Введение в работу с удаленными базами данных
369
Рис. 13.3. Окно ввода имени пользователя и пароля
На этапе разработки управлять значениями названных свойств можно в окне Редактора параметров соединения (рис. 13.4). Оно вызывается двойным щелчком на компоненте Database или вызовом команды Database editor контекстного меню компонента.
Элементы управления этого окна отображают и позволяют изменять значения соответствующих свойств компонента Database:
□ поле редактирования Name — свойство DatabaseName;
□ комбинированный список Alias name — свойство AiiasName;
□ комбинированный список Driver name — свойство DriverName;
□ многострочное поле редактирования Parameter overrides (Новые значения
параметров) — свойство Params;
□ флажок Login prompt (Входное сообщение) — свойство LoginPrompt;
370
Часть III. Удаленные базы данных
П флажок Keep inactive connection (Сохранять неактивное соединение) — свойство KeepConnection.
Отметим, что на рис. 13.3 и 13.4 в качестве имени базы данных выводится именно значение свойства DatabaseName, а не имя (значение свойства Name) компонента Database.
Свойство connected типа Boolean определяет, установлено ли соединение с БД. Соединение с БД можно установить при разработке приложения, задав для этого свойства значение True через Инспектор объектов.
При выполнении приложения можно также установить или разорвать соединение с БД, используя методы opennciose соответственно.
Свойства DataSetcount и DataSets позволяют получить доступ к наборам данных, связанным в настоящий момент времени с БД. Свойство DataSetcount типа integer определяет число таких наборов, а свойство DataSets [index: integer] типа TDBDataSet представляет собой коллекцию (массив) этих наборов данных. Доступ к отдельному набору данных можно получить по его номеру в массиве (нумерация начинается с нуля, т. е. последний набор данных имеет номер DataSetcount - 1).
При выполнении операций с удаленными БД автоматически запускается механизм транзакций, в данном случае называемый неявным. Кроме того, программист может управлять транзакциями и явно, но при этом нужно учитывать, что явные транзакции несколько замедляют выполнение операций с БД. Механизм транзакций реализуется с помощью ряда свойств и методов компонента Database.
Методы startTransaction (иницирует начало транзакции), commit (подтверждает текущую транзакцию и Rollback (отменяющий ее) были рассмотрены в главе 7, посвященной навигационному способу доступа к данным с помощью механизма BDE.
Свойство inTransaction типа Boolean позволяет определить, существует ли активная транзакция для текущего соединения с БД. Если имеется незавершенная транзакция, то свойство имеет значение True, и значение False — в противном случае. Это свойство можно использовать, например, при подтверждении транзакции. Если активной транзакции нет, то вызов метода commit приводит к генерации исключения. Например:
if Databasel.InTransaction then Databasel.Commit;
Если имеется активная транзакция, то она подтверждается, а все сделанные в ее рамках изменения БД вступают в действие.
Свойство Transisoiation типа TTransisoiation управляет уровнем изоляции транзакций. Уровень изоляции определяет, каким образом транзакция взаимодействует с другими транзакциями. Ниже приведен список возможных значений свойства Transisoiation.
□ tiDirtyRead — разрешается чтение изменений в записях БД, сделанных в рамках других транзакций (другими пользователями). В связи с тем, что на
Глава 13. Введение в работу с удаленными базами данных
371
момент чтения эти изменения являются неподтвержденными и впоследствии могут быть отменены, этот уровень изоляции обеспечивает минимальную изоляцию (защиту) от других транзакций.
□ tiReadCommitted — разрешается чтение только подтвержденных изменений в записях БД (по умолчанию). Если изменения еще не подтверждены, то читается предыдущая версия записи.
□ tiRepeatabieRead — считывание сразу всей БД, после чего изменения в БД, сделанные в рамках других транзакций, становятся невидимыми. Этот уровень обеспечивает максимальную изоляцию.
Для локальных БД dBase и Paradox допустимым является только значение tiDirtyRead. Для сервера InterBase значение tiDirtyRead интерпретируется как
tiReadCommitted.
Компонент Session
Компонент session представляет собой текущий сеанс работы с БД и наряду с компонентом Database используется для управления соединением с БД. Однако если компонент Database позволяет задавать параметры одного соединения с БД или параметры соединения с одной БД, то компонент session управляет всеми соединениями со всеми БД. Если программист при разработке приложения не разместил в форме компонент session, то будет создаваться динамический (временный) объект ТИПа TSession (TSessionList).
Наряду с управлением соединениями с БД, использование компонента session также позволяет:
□ управлять установками BDE;
□ управлять паролями БД.
Свойство sessionName типа string задает имя сеанса. Это имя устанавливается программистом, и его назначение не совпадает с назначением свойства Name, которое определяет имя самого компонента session. Однако в частном случае эти имена могут совпадать.
Свойства сеанса, заданного компонентом session, действуют на все связанные с ним компоненты Database. Напомним, что компонент Database связывается с сеансом через свое свойство SessionName, значение которого при разработке приложения выбирается в списке Инспектора объектов.
С ПОМОЩЬЮ СВОЙСТВ DatabaseCount И Databases МОЖНО получить доступ К активным БД, с которыми в настоящее время установлено соединение. Свойство DatabaseCount типа Integer содержит ЧИСЛО таких БД, а СВОЙСТВО Databases [Index: Integer] типа TDatabase представляет собой коллекцию (массив) объектов Database, используемых для соединения с этими БД. Доступ к отдельной БД можно получить по ее номеру в массиве (нумерация начинается с нуля, поэтому последняя БД имеет номер DatabaseCount - 1).
372
Часть III. Удаленные базы данных
Свойство KeepConnections типа Boolean определяет, сохранять ли соединение с БД, если с ней не связан ни один набор данных. Это свойство аналогично свойству KeepConnection соединения с отдельной БД, заданного компонентом Database. Разорвать соединение с БД можно, вызвав метод DropConnections.
Свойства NetFileDir И PrivateDir ТИПа String ПОЗВОЛЯЮТ задать катЭЛОГИ ДЛЯ
хранения управляющего сетевого файла с расширением net (для таблиц Paradox) и рабочего каталога для хранения временных файлов сеанса соответственно.
Свойство Active типа Boolean управляет активностью сеанса. Установка этого свойства в значение True активизирует сеанс, а значения False — деактивизи-рует его. При выполнении приложения управлять активностью сеанса можно также с помощью методов opennciose соответственно.
Непосредственно перед активизацией сеанса генерируется событие Onstartup
ТИПа TNotifyEvent.
Для управления установками BDE компонент session имеет средства, позволяющие читать и изменять параметры драйверов и псевдонимов БД. Рассмотрим наиболее важные из них.
Методы GetAliasNames И GetAliasParams обеспечивают получение информации о псевдонимах BDE. Процедура GetAliasNames (List: TStrings) позволяет получить список псевдонимов BDE. Список заносится в объект, заданный параметром List типа TStrings, которым может быть, например, список строк компонента ListBox. Приведем соответствующий пример:
procedure TForml.ButtonlClick(Sender: TObject);
begin
Sessionl.GetAliasNames(ListBoxl.Ltems);
end;
Здесь нажатие кнопки Buttoni приводит к загрузке в компонент ListBoxl списка псевдонимов BDE. Предыдущее содержимое компонента ListBoxl теряется.
Процедура GetAliasParams (const AliasName: String; List: TStrings) возвращает параметры конкретного псевдонима, имя которого задано параметром процедуры AliasName. Если имя псевдонима указано неправильно, то генерируется исключение. Например:
procedure TForml.Button2Click(Sender: TObject);
begin
Sessionl.GetAliasParams(Editl.Text, ListBoxl.Items);
end;
При нажатии кнопки Button2 в компонент ListBoxl заносятся параметры псевдонима, введенного в компонент Editl. Предыдущее содержимое компонента ListBoxl теряется.
Глава 13. Введение в работу с удаленными базами данных
373
Для добавления и удаления псевдонимов предназначены методы AddAiias и
DeleteAlias соответственно. Процедура AddAlias (const Name, Driver: String; List: TStrings) Добавляет НОВЫЙ ПСеВДОНИМ С именем Name. Параметр Driver
определяет драйвер нового псевдонима, а параметр List содержит список параметров псевдонима. Пример создания псевдонима для локальной БД:
procedure TForml.Button3Click(Sender: TObject);
begin
Sessionl.AddAlias(Editl.Text, 'STANDARD', Memol.Lines);
end;
В процедуре создается новый псевдоним, имя которого набрано в компоненте Editl. Псевдоним предназначен для работы с локальными БД dBase или Paradox, на что указывает тип standard псевдонима. Напомним, что локальные БД этих типов работают под управлением драйвера standard. Параметры псевдонима должны быть указаны в компоненте Memol. Необходимо указать хотя бы расположение БД, например, введя в поле редактирования следующий текст:
PATH = d:\data
Имя нового псевдонима должно быть уникальным: если указанный псевдоним уже существует, то генерируется исключение.
В качестве примера рассмотрим следующую процедуру:
procedure TForml.Button3Click(Sender: TObject);
var Params: TStringList;
begin
Params:= TStringList.Create;
try
Params.Add('SERVER NAME=d:\ibData\registration.gdb');
Params.Add('USER NAME=SYSDBA');
Params.Add('PASSWORD=masterkey');