Глава 15

Этапы создания приложения баз данных

Среда разработки Delphi ориентирована на создание самых разнообразных приложений баз данных. Это и небольшие локальные программы, и многоуровневые распределенные системы, использующие новейшие технологии. Но, несмотря на сложность приложения, в его основе всегда лежит базовый механизм обеспечения доступа к данным. Он создается триадой компонентов:

Компоненты доступа к данным расположены на странице Data Access Палитры компонентов. Компоненты отображения данных расположены на странице Data Controls Палитры компонентов.

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

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

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

Как работает приложение баз данных

Разработка приложения баз данных, как и любого другого приложения Delphi, начинается с создания интерфейса — в первую очередь разрабатывается форма. Приложение может содержать произвольное число форм и использовать любой интерфейс (MDI или SDI). Обычно одна форма отвечает за выполнение группы однородных операций, объединенных общим назначением.

В основе работоспособности любого приложения баз данных лежат наборы данных, которые представляют собой группы записей, переданных из базы данных в приложение для просмотра и редактирования. (Подробно наборы данных рассмотрены в следующей главе.) Каждый набор данных инкапсулирован в специальном компоненте доступа к данным. Эти компоненты располагаются на странице Data Access Палитры компонентов.

В приложениях баз данных для работы с набором данных используются компоненты TTable и TQuery, которые обеспечивают создание набора данных для отдельной таблицы БД. Компонент TTable чаще используется в локальных приложениях. Подробное описание компонента TTable представлено в главе 16.

При работе с серверами БД чаще всего используется специальный язык SQL (Structured Query Language — язык структурированных запросов). Для обеспечения использования в приложении наборов данных, созданных на основе запросов SQL, применяется компонент TQuery. Подробно он рассматривается в следующей части.

Настройка свойств, отвечающих за подключение к базе данных, в компонентах TTable и TQuery практически не отличаются.

Компонент TStoredProc также применяется в приложениях, работающих с серверами БД, и обеспечивает использование процедур — запросов SQL, которые хранятся на сервере, выполняют наиболее распространенные операции и специально оптимизированы на скорость выполнения.

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

Компоненты отображения данных расположены на странице Data Controls

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

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

Рассмотрим схему взаимодействия этих компонентов в приложении баз данных (рис. 15.1).

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

Рис. 15.1. Механизм доступа к данным приложения баз данных

В приложении с BDE взаимодействует компонент доступа к данным, который инкапсулирует набор данных и обращается к функциям API BDE для выполнения различных операций. Компонент доступа к данным представляет собой "образ" таблицы базы данных в приложении. Общее число таких компонентов в приложении не ограничено.

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

Еще одна функция компонента TDataSource заключается в синхронизации поведения компонентов отображения данных с состоянием набора данных. Например, если набор данных не активен, то компонент TDataSource обеспечивает удаление данных из компонентов отображения данных и их перевод в неактивное состояние. Или, если набор данных работает в режиме "только для чтения", то компонент TDataSource обязан передать в компоненты отображения данных запрещение на изменение данных.

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

При открытии набора данных BDE обеспечивает передачу в набор данных записей из требуемой таблицы БД. Курсор набора данных устанавливается на первую запись. Компонент TDataSource организует передачу в компоненты отображения данных значений необходимых полей из текущей записи.

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

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

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

Модуль данных

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

Для создания модуля данных можно воспользоваться Репозиторием объектов. Значок модуля данных Data Module расположен на странице New.

На самом деле, модуль данных имеет мало общего со стандартной формой хотя бы потому, что класс TDataModule происходит непосредственно от класса TComponent. У него почти полностью отсутствуют свойства и методы-обработчики событий, но так как его основное назначение — хранение других невизуальных компонентов, то этого минимума свойств вполне достаточно.

Интерфейс модуля данных состоит из двух частей.

Слева располагается иерархическое дерево, содержащее информацию о компонентах модуля данных. Компоненты, инкапсулирующие набор данных, содержат дополнительные данные. Для компонента TTable это:

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

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

Страница Components предназначена для размещения не визуальных компонентов доступа к данным (рис. 15.2).

Рис. 15.2. Иерархическое дерево компонентов и страница компонентов модуля данных

Страница Data Diagram используется для создания структуры (модели, диаграммы) данных, с которой работает приложение (рис. 15.3). Любой элемент из иерархического дерева компонентов можно перенести на страницу модели данных и задать связи между ними.

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

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

unit InterfaceModule;

implementation

uses DataModule;

DataModule. Tablel. Open;

Рис. 15.3. Иерархическое дерево компонентов и страница компонентов модуля данных

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

Подключение набора данных

Компонент доступа к данным является основой приложения баз данных. На основе выбранной таблицы БД он создает набор данных и позволяет эффективно управлять им. В процессе работы такой компонент тесно взаимодействует с BDE. Все компоненты доступа к данным являются не визуальными.

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

Для создания нового проекта достаточно выбрать команду New Application из меню File или воспользоваться Репозиторием объектов, который открывается командой New из меню File.

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

  1. Подключить к компоненту базу данных. Для этого используется свойство DatabaseName, доступное в Инспекторе объектов. В нем необходимо указать зарегистрированный в BDE псевдоним базы данных или полный путь к файлам БД. Псевдоним можно выбрать из списка этого свойства в Инспекторе объектов.
  2. Подключить к компоненту таблицу БД. Для этого используется свойство TableName, доступное в Инспекторе объектов. После выполнения действий первого этапа в списке этого свойства должны появиться имена всех доступных в подключенной базе данных таблиц. Содержимое списка может изменяться в зависимости от значения свойства TableType, которое определяет тип доступных таблиц. При значении ttDefault для локальных СУБД в списке приводятся имена файлов всех таблиц вместе с расширением. Для серверов БД всегда доступны только имена. Другие значения свойства TableType определяют типы локальных СУБД: (ttAscii, ttDBase, ttparadox, ttFoxpro). После выбора имени таблицы в свойстве TableName компонент оказывается связанным с ней.
  3. Переименовать компонент. Это не обязательное действие. Тем не менее, в любом случае желательно присваивать компонентам доступа к данным осмысленные имена, соответствующие названиям подключенных таблиц. Обычно название компонента полностью копирует название таблицы или комбинирует его со словом Table (например, orders или OrdTable).
  4. Активизировать связь между компонентом и таблицей БД. Для этого используется свойство Active. Если в инспекторе объектов присвоить этому свойству значение True, то связь активизируется. Эту операцию можно выполнить и в исходном коде приложения. Метод open открывает набор данных, а метод close закрывает его.

В качестве примера попробуем создать простейшее приложение баз данных, работающее с таблицей COUNTRY.DB из стандартной демонстрационной базы данных DBDEMOS.

На форму нового проекта необходимо перенести компонент TTable со страницы Data Access палитры компонентов. Свойство DatabaseName должно

ссылаться на псевдоним DBDEMOS. Свойство TableName имеет значение 'country.db'. Двойной щелчок на свойстве Active в Инспекторе объектов присваивает ему значение True. После этого связь компонента с таблицей активизируется. Свойство Name имеет значение 'countryTabie'.

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

 

Листинг 15.1 Секция Implemention главного модуля проекта DemoDBApp implementation

{$R *.DFM}

procedure TFormI.FormShow(Sender: TObject);

begin try CountryTable.Open;

except ShowMessage('Ошибка открытия таблицы');

end;

end;

procedure TForml.FormClose(Sender: TObject; var Action: TCloseAction);

begin

try

finally CountryTable.Close;

end;

end;

end.

При открытии формы выполняется метод обработчик FormShow. В нем набор данных открывается при помощи метода open. Обратите внимание на использование конструкции try...except, которая обеспечивает корректное завершение при возникновении исключительных ситуаций.

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

В методе-обработчике FormClose, который вызывается при закрытии формы, набор данных закрывается методом close. Метод помещен в блок try. .. finally, так как должен быть выполнен в любом случае.

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

 Настройка компонента TDataSource

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

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

  1. Связать набор данных и компонент TDataSource. Для этого используется свойство DataSet, доступное через Инспектор объектов. Это указатель на экземпляр компонента доступа к данным. В списке этого свойства в Инспекторе объектов перечислены все доступные компоненты наборов данных.
  2. Переименовать компонент. Это не обязательное действие. Тем не менее. желательно присваивать компонентам осмысленные имена, соответствующие названиям связанных наборов данных. Обычно название компонента комбинирует имя набора данных со словом source (например, ordsource).

Компонент TDataSource имеет ряд свойств и методов, описание которых представлено в табл. 15.1.

Таблица 15.1. Свойства и методы компонента TDataSource

Объявление

Тип

Описание

Свойства

property AutoEdit: Boolean;

Pb

При значении True набор данных автоматически вызывает свой метод Edit при потере фокуса компонентом отображения данных

property DataSet: TdataSet;

Pb

Указатель на связанный с компонентом набор данных

property Enabled: Boolean;

Pb

При значении True связанные с компонентом элементы управления отображают данные. При значении False данные не отображаются

type TdataSetState =-(dslnactive, dsBrowse, dsEdit, dslnsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc);

property State: TdataSetState;

Ro

Отображает состояние набора данных, связанного с компонентом (гл. 16)

Методы

procedure Edit;

Pu

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

function isLinkedTo (DataSet: TdataSet) Boolean;

Pu

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

Методы-обработчики событий

type TdataChangeEvent = procedure (Sender: Tobject; Field: Tfield) of object;

Рb

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

property OnDataChange: TdataChangeEvent;

property OnStateChange: TnotifyEvent;

Pb

Вызывается при изменении состояния набоpa данных(гл. 16)

property OnUpdateData: TnotifyEvent;

Pb

Вызывается перед сохранением изменений в базе данных

В приложении DemoDBApp компонент countrysource связан с компонентом CountryTable. Для этого свойство DataSet имеет значение CountryTable.

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

 Отображение данных

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

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

Компоненты отображения данных должны быть связаны с компонентом TDataSource и через него с компонентом набора данных. Для этого используется свойство DataSource. Оно присутствует во всех компонентах отображения данных.

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

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

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

  1. Связать компонент отображения данных ч компонент TDataSource. Для этого используется свойство DataSource, которое должно указывать на экземпляр требуемого компонента TDataSource. Один компонент ото- ] бражения данных можно связать только с одним компонентом TDataSource. Необходимый компонент можно выбрать в списке свойства в Инспекторе объектов.
  2. Задать поле данных. Для этого используется свойство DataField типа TFields. В нем необходимо указать имя поля связанного набора данных. После задания свойства DataSource поле можно выбрать из списка. Этот этап применяется только для компонентов, отображающих единственное поле.

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

В Приложении DemoDBApp использованы компаненты TDBGrid, TDBNavigator И TDBEdit (рис. 15.4).

Все три компонента отображения данных связаны с компонентом CapitalSource типа TDataSource при помощи свойства DataSource.

  1. Компонент TDBEdit отображает данные из поля capital (столица государства) и позволяет редактировать их.
  2. Компонент TDBGrid показывает набор данных целиком, данные в ячейках можно редактировать.
  3. Компонент TDBNaviqator позволяет перемещаться по записям набора данных capitaiTabie. При этом результат заметен во всех подключенных к набору данных компонентах отображения данных.

Рис. 15.4. Главная форма приложения DemoDBApp

 Резюме

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

Материал главы лежит в основе следующих четырех глав.