Компоненты наборов данных и их связь с элементами управления для работы с данными
Рассмотренные выше компоненты доступа к данным используются компонентами следующего уровня – компонентами набора данных, которые обращаются к функциям соответствующей технологии доступа к данным для выполнения различных операций, т.е. для каждого метода доступа к данным используются свои собственные компоненты (см. таблицу 3). Компонент набора данных представляет собой «образ» таблицы (или запроса) базы данных в приложении. Все компоненты набора данных являются наследниками класса TDataSet, и наследуют общие свойства и методы этого класса. Общее число таких компонентов в приложении не ограничено.
С каждым компонентом доступа к данным может быть связан как минимум один компонент TDataSource. Класс TDataSource реализует связь между компонентами - наборами данных и элементами управления, используемыми для отображения данных.
С одним компонентом TDataSource могут быть связаны несколько визуальных компонентов отображения данных. Эти компоненты представляют собой элементы управления, которые предназначены для показа информации из наборов данных.
Рисунок 1. Механизм доступа к данным приложения баз данных
Пользователь при помощи компонентов отображения данных может просматривать и редактировать данные. Измененные значения сразу же передаются из элемента управления в набор данных при помощи компонента TDataSource. Затем изменения могут быть переданы в базу данных или отменены.
Теперь рассмотрим компоненты, которые пригодятся нам при создании приложения, которое будет взаимодействовать с базой данных Interbase.
Компоненты доступа к данным
Подключение набора данных
Любое приложение баз данных должно уметь выполнять как минимум две операции.
Во-первых, иметь информацию о местонахождении базы данных, подключаться к ней и считывать имеющуюся в таблицах БД информацию. Эта функция в значительной степени зависит от реализации конкретной технологии доступа к данным.
Во-вторых, обеспечивать представление и редактирование полученных данных. Множество записей одной или нескольких таблиц, переданные в приложение в результате активизации компонента доступа к данным, будем называть набором данных. Понятно, что в объектно-ориентированной среде для представления какой-либо группы записей приложение должно использовать возможности некоторого класса. Этот класс должен инкапсулировать набор данных и обладать методами для управления записями и полями.
Компонент доступа к данным является основой приложения баз данных. Он создает набор данных и позволяет эффективно управлять им. В процессе работы такой компонент тесно взаимодействует с функциями соответствующей технологии доступа к данным.
На первом этапе разработки приложения баз данных необходимо:
- Разместить на форме компонент, отвечающий за доступ к данным;
- Переименовать компонент. Это не обязательное действие. Тем не менее, в любых случаях желательно присваивать компонентам доступа к данным осмысленные имена, соответствующие названиям подключенных таблиц;
- Подключить его к конкретной базе данных;
- Настроить подключенный компонент на нужные данные (например, задать запрос для извлечения данных);
- Активизировать связь между компонентом данными. Для этого используется свойство Active. Если в Инспекторе объектов присвоить этому свойству значение True, то связь активизируется. Эту операцию можно выполнить и в исходном коде приложения. Также существует метод Open, который открывает набор данных, и метод Close, закрывающий его.
Компонент TIBDatabase
Для компонентов InterBase соединение с сервером БД осуществляет компонент TIBDatabase. Для компонентов InterBase Express соединение с сервером БД осуществляет компонент TIBDatabase. Все компоненты InterBase Express, инкапсулирующие набор данных, должны обращаться к базе данных только через компонент соединения TIBDatabase.
Для доступа к базе данных для создания соединения используется всего одно свойство DatabaseName. В нем необходимо указать полный путь (включая имя сервера) к выбранному файлу БД с расширением gdb. Для этого можно воспользоваться стандартным диалогом выбора файла при щелчке на кнопке свойства в Инспекторе объектов.
Компонент имеет собственный редактор, который позволяет задать значения основных свойств, обеспечивающих соединение с базой данных (рис.2).
Рисунок 2. Редактор компонента TIBDatabase
Настройка соединения проводится следующим образом.
На панели Connection выбирается требуемый сервер InterBase (локальный или доступный удаленно), затем в списке Protocol определяется используемый сетевой протокол и при помощи кнопки Browse выбирается файл базы данных.
На панели Database Parameters задаются имя пользователя, его пароль и роль. Также можно выбрать и набор шрифтов для языковой адаптации приложения (список Character Set).
Для задания вводимых при подключении параметров (имя пользователя, пароль, схема, роль и т. д.) также можно использовать свойства Params и LoginPrompt.
Путь к файлу базы данных задается свойством
property DatabaseName: String;
Соединение включается и отключается свойством
property Connected : Boolean;
При этом свойство
property AllowStreamedConnected : Boolean;
управляет включением соединения при запуске приложения и служит дополнительным предохранителем. При значении False свойство запрещает открытие соединения при запуске приложения, даже если свойство Connected имело значение True. Так как часто приложение отлаживается на тестовой базе данных, а используется на реальной, то неверный путь в свойстве DatabaseName и не отключенное на этапе разработки свойство connected приведет к возникновению ошибки открытия соединения при запуске приложения на другом компьютере.
Параметры соединения, которые нельзя задать свойствами, устанавливаются свойством
property Params: TStrings;
в котором в каждой строке задается имя параметра и затем через знак равенства — его значение. Наиболее распространенный пример использования свойства Params — задание имени пользователя и его пароля:
user_name=sysdba password=masterkey
Свойство
property DBParamByDPB: [const Idx: Integer]: String;
позволяет получить доступ к отдельным параметрам соединения, не обращаясь к свойству Params.
Если соединение настроено правильно, метод
procedure TestConnected: Boolean;
возвращает значение True, иначе — False. Свойство
property IdleTimer: Integer;
задает временной интервал до отключения неиспользуемого соединения.
В компоненте TiBDatabase отсутствуют средства управления транзакциями, которые вынесены в отдельный компонент TiBTransaction (см. ниже).
Свойство
property DefaultTransaction: TiBTransaction;
позволяет задать транзакцию по умолчанию. При этом все компоненты с наборами данных, использующие данное соединение автоматически, начинают применять этот компонент транзакции. Изменяя значение этого свойства, можно в одном соединении работать с несколькими транзакциями.
Компонент TiBDatabase позволяет выполнять некоторые операции с метаданными базы данных.
При помощи метода
procedure CreateDatabase;
можно создавать новые базы данных, включая создание файла базы данных. Все параметры новой базы данных, которые разработчик посчитает нужным указать явно, должны быть включены в список свойства Params (см. выше).
Имя файла новой базы данных должно быть указано в свойстве
procedure DropDatabase;
удаляет существующую базу данных, путь к которой указан свойством
DatabaseName.
Список List имен таблиц, имеющихся в базе данных, возвращает метод
procedure GetTableNames(List: TStrings; SystemTables: Boolean = False);
При этом параметр SystemTables управляет включением в список имен системных таблиц.
Компонент TIBTransaction
Транзакция - набор логически связанных операций, работающих с данными базы данных, и либо переводящий базу данных в из одного целостного состояния в другое, либо нет (т.е. оставляющий БД в целостном состоянии, существовавшем до начала транзакции).
Компонент TIBTransaction инкапсулирует средства управления транзакцией при работе с сервером InterBase. Для этого он должен быть связан с компонентом TiBDatabase при помощи своего свойства
property DefaultDatabase: TiBDatabase;
Один компонент транзакции может быть связан с несколькими компонентами TiBDatabase. Для этого необходимо задать один компонент транзакции в свойствах DefaultTransaction всех необходимых компонентов соединений (см. выше). Список всех связанных компонентов соединений содержится в свойстве
property Databases[Index: Integer]: TiBDatabase;
а их общее число возвращает свойство
property DatabaseCount: Integer;
Транзакция стартует при помощи метода
procedure StartTransaction;
При необходимости сохранить все сделанные в рамках текущей транзакции изменения используется метод
procedure Commit;
Если выполненные действия нужно отменить, применяется метод
procedure Rollback;
Для открытия и сохранения транзакции можно использовать традиционное свойство
property Active: Boolean;
После начала новой транзакции свойство
property InTransaction: Boolean;
принимает значение True, а после фиксации или отката — значение False.
При работе с сервером InterBase можно использовать методы commit-Retaining и RollbackRetaining. В отличие от стандартных операций фиксации и отката транзакций, эти методы после передачи или отмены изменений оставляют текущую транзакцию открытой.