Реализация доступа к базам данных в среде DELPHI
Классы компонентов управления данными
Компоненты управления данными расположены на странице Data Controls палитры компонентов. Многие из этих компонентов аналогичны элементам управления страницы Standard, с тем лишь отличием, что связаны через источник данных (компонент типа TDataSource ) с определенным полем (или полями) из набора данных (компонентов типа TTable или TQuery ).
Библиотека VCL предоставляет следующие классы компонентов управления данными:
- TDBGrid - класс, позволяющий отображать записи набора данных в виде таблицы и управлять этими записями.
-
TDBNavigator - класс, предоставляющий средства навигации по набору данных, а также возможности добавления новых записей, включения режима редактирования, присвоения и отмены сделанных изменений. Для того чтобы программно инициировать действие, выполняемое по щелчку на кнопке навигатора, следует вызвать метод BtnClick. Например:
DBNavigator1.BtnClick(nbPost); // Присвоение сделанных изменений.
Компонент TDBNavigator может отображать кнопки, указываемые следующими константами:
nbFirst - переход к первой записи;
nbPrior - переход к предыдущей записи;
nbNext - переход к следующей записи;
nbLast - переход к последней записи;
nbInsert - вставка перед текущей записью новой записи и переход на нее;
nbDelete - удаление текущей записи;
nbEdit - переход в режим редактирования текущей записи;
nbPost - внесение изменений текущей записи в базу данных;
nbCancel - отмена изменений, сделанных в текущей записи;
nbRefresh - повторное считывание значений полей из источника данных.
- TDBText - класс, позволяющий в качестве надписи отображать значение поля текущей записи набора данных.
- TDBEdit - класс, реализующий работу с однострочным полем редактирования.
- TDBMemo - класс, реализующий многострочное поле редактирования, в котором можно отображать и изменять значение поля набора данных.
- TDBImage - класс, реализующий объект "рисунок", в котором можно отображать и изменять значение поля набора данных формата BLOB.
- TDBRadioGroup - класс, реализующий группу радиокнопок, которые связаны с полем базы данных. Применение такого объекта предоставляет пользователю удобную возможность устанавливать значение поля базы данных, выбирая его из предлагаемых опций.
- TDBCheckBox - класс, реализующий компонент "флажок", который связан с полем базы данных.
- TDBListBox - класс, реализующий компонент "список", который используется для отображения значений поля набора данных. Значения, отображаемые в списке, содержатся в свойстве Items.
- TDBComboBox - класс, реализующий компонент "раскрывающийся список", который используется для отображения значений поля набора данных. Значения, отображаемые в списке, содержатся в свойстве Items.
- TDBLookupListBox - класс, позволяющий выполнять просмотр списка, заполненного значениями полей из другого набора данных. Просматриваемый набор данных указывается свойством ListSource, просматриваемое поле (или поля) - свойством ListField. Свойство KeyField указывает поле просматриваемого набора данных, соответствующее полю текущего набора данных, указываемого свойствами DataField и DataSource. Данный класс позволяет выбирать значение поля текущего набора данных из другого просматриваемого набора данных;
- TDBCtrlGrid - класс, реализующий особый вид таблицы, в которой каждая запись отображается на отдельной панели (количество панелей в компоненте указывается значением свойства RowCount ).
События, инициируемые для наборов данных
При работе с наборами данных могут инициироваться следующие события:
- AfterCancel и BeforeCancel - происходит после/до отмены в приложении всех изменений, сделанных для текущей записи.
- AfterClose и BeforeClose - происходит после/до закрытия набора данных и перевода базы данных в состояние dsInactive.
- AfterDelete и BeforeDelete - инициируется после/до удаления приложением текущей записи, перевода набора данных в состояние dsBrowse и перемещения позиции курсора на предыдущую запись.
- AfterEdit и BeforeEdi - происходит после/до начала редактирования приложением текущей записи.
- AfterInsert и BeforeInsert - происходит после/до того как приложение вставит новую запись.
- AfterOpen и BeforeOpen - происходит после/до того как приложение откроет набор данных, но до того, как какие-либо доступные данные будут отображены.
- AfterPost и BeforePost - происходит до завершения переноса значений активной записи в базу данных или внутренний кэш.
- AfterRefresh и BeforeRefresh - происходит после/до обновления набора данных.
- AfterScroll и BeforeScroll - происходит после/до перемещения позиции курсора на другую запись.
- OnCalcFields - происходит при открытии набора данных, перевода его в состояние dsEdit, перемещении фокуса ввода от одного компонента к другому или от одного столбца к другому, при изменениях записи или при извлечении записи из базы данных, но только в том случае, если значение свойства AutoCalcFields равно True ;
- OnDeleteError - инициируется, если при попытке удаления строки произошла ошибка - было брошено исключение.
- OnEditError - инициируется, если при попытке изменения или вставки записи произошла ошибка - было брошено исключение.
- OnPostError - инициируется, если при попытке передать изменение или вставку новой записи происходит ошибка - бросается исключение.
- OnFilterRecord - происходит при изменении активной записи и только в том случае, если свойство State набора данных установлено равным dsFilter, а свойство Filtered равно True. Чтобы запись была включена в набор данных, для нее следует установить параметр Accept равным True.
- OnNewRecord - происходит при вставке или добавлении новой записи.
Применение многозвенных архитектур
Применение многозвенной архитектуры позволяет вынести бизнес-логику работы с данными в приложение-сервер.
При многозвенной архитектуре приложение разбивается на ряд компонентов, которые могут выполняться на различных компьютерах.
Применение трехзвенной архитектуры приведено на следующей схеме.
Такая архитектура позволяет реализовывать доступ к серверу БД из приложения-сервера, не имея на клиентских машинах никаких драйверов доступа к базе данных.
Большое преимущество использования такой архитектуры заключается также в возможности изменения серверной части без необходимости перетрансляции клиентского приложения.
Приложение-сервер получает набор данных стандартным способом - через один из компонентов набора данных, таких как TTable или Tquery, и пересылает его с помощью компонента TDataSetProvider компоненту TClientDataSet в приложение-клиент. Приложение-сервер реализуется как удаленный модуль данных, представляющий из себя СОМ-объект. Доступ к такому компоненту может быть выполнен посредством DCOM с любого удаленного компьютера.