Информация о состоянии базы данных
В процессе отладки и выполнения клиентских приложений для сервера InterBase разработчик может получать подробную информацию об этих процессах.
Компонент TiBDatabaseinfo предоставляет информацию о текущем состоянии базы данных.
Компонент TiBSQLMonitor отслеживает выполнение запросов на сервере.
Компонент TIBDatabase
Так как для доступа к базе данных компонентам InterBase Express не требуется BDE, то для создания соединения используется всего одно свойство DatabaseName. В нем необходимо указать полный путь (включая имя сервера) к выбранному файлу БД с расширением gdb. Для этого можно воспользоваться стандартным диалогом выбора файла при щелчке на кнопке свойства в Инспекторе объектов.
Компонент имеет собственный редактор, который позволяет задать значения основных свойств, обеспечивающих соединение с базой данных (рис. 18.1).
Рис. 18.1. Редактор компонента 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.
Примечание
Полный список индексов всех возможных параметров соединения Interbase можно найти в файле \Delphi7\Source\Vcl\IBHeader.pas.
Если соединение настроено правильно, метод
procedure TestConnected: Boolean;
возвращает значение True, иначе — False. Свойство
property IdleTimer: Integer;
задает временной интервал до отключения неиспользуемого соединения.
В компоненте TiBDatabase отсутствуют средства управления транзакциями, которые вынесены в отдельный компонент TiBTransaction (см. ниже).
Свойство
property DefaultTransaction: TiBTransaction;
позволяет задать транзакцию по умолчанию. При этом все компоненты с наборами данных, использующие данное соединение автоматически, начинают применять этот компонент транзакции. Изменяя значение этого свойства, можно в одном соединении работать с несколькими транзакциями.
Общее число связанных с данным соединением транзакций возвращает свойство
property TransactionCount: Integer;
а их полный перечень содержится в индексированном списке свойства
property Transactions [Index: Integer]: TIBTransaction;
Добавить к списку используемых новую транзакцию можно при помощи метода
function AddTransaction(TR: TIBTransaction): Integer;
Отменить связь между соединением и компонентом транзакции позволяет метод
procedure RemoveTransaction(Idx: Integer);
Но можно поступить и более радикально. Метод
procedure RemoveTransactions;
отменяет связи со всеми транзакциями.
Используемый в методе RemoveTransaction индекс транзакции может быть найден методом
function FindTransaction (TR: TIBTransaction): Integer;
а метод
function FindDefaultTransaction: TIBTransaction;
возвращает транзакцию по умолчанию.
С компонентом соединения можно связать произвольное число объектов, отслеживающих возникновение событий в базе данных InterBase (см. ниже). Для этого используется метод
procedure AddEventNotifier(Notifier: IIBEventNotifier);
который связывает с соединением либо интерфейс IIBEventNotifier, либо объект TIBEvents.
Парный ему метод
procedure RemoveEventNotifier{Notifier: IIBEventNotifier);
разрывает связь соединения с объектом-обработчиком событий. Свойство
type
TTraceFlag = (tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt,
tfConnect, tfTransact, tfBlob, tfService, tfMisc);
TTraceFlags = set of TTraceFlag;
property TraceFlags: TTraceFlags;
позволяет управлять сведениями о выполнении запросов, возвращаемыми компонентом TSQLMonitor (см. ниже описание этого компонента).
Группа методов позволяет судить о реальном состоянии соединения во время выполнения. Все они в случае неудачи проверки генерируют исключение
EIBClientError.
Методы
procedure CheckActive;
И
procedure Checklnactive;
проверяют, функционирует или нет соединение. Метод
procedure CheckDatabaseName;
проверяет, заполнено ли свойство DatabaseName.
Компонент TiBDatabase позволяет выполнять некоторые операции с метаданными базы данных.
При помощи метода
procedure CreateDatabase;
можно создавать новые базы данных, включая создание файла базы данных. Все параметры новой базы данных, которые разработчик посчитает нужным указать явно, должны быть включены в список свойства Params (см. выше).
Имя файла новой базы данных должно быть указано в свойстве
procedure DropDatabase;
удаляет существующую базу данных, путь к которой указан свойством
DatabaseName.
Список List имен таблиц, имеющихся в базе данных, возвращает метод
procedure GetTableNames(List: TStrings; SystemTables: Boolean = False);
При этом параметр SystemTables управляет включением в список имен системных таблиц.
Метод
procedure GetFieldNames(const TableName: string; List: TStrings);
аналогичным образом возвращает список полей для таблицы, заданной параметром TableName.
Методы- обработчики событий компонента TiBDatabase представлены в табл. 18.1.
Таблица 18.1. Методы-обработчики событий компонента TiBDatabase
Объявление |
Тип |
Описание |
property Af terConnect: TNotifyEvent; |
Pb |
Выполняется после открытия соединения |
property AfterDisconnect: TNotifyEvent; |
Pb |
Выполняется после закрытия соединения |
property Bef oreConnect: TNotifyEvent; |
Pb |
Выполняется перед открытием соединения |
property BeforeDisconnect: TNotifyEvent; |
Pb |
Выполняется перед закрытием соединения |
property OnDialectDowngradeWarning: TNotifyEvent; |
Pb |
Выполняется в случае изменения диалекта SQL при открытии соединения |
property OnldleTimer: TNotifyEvent; |
Pb |
Вызывается по истечении времени, заданного свойством dleTimer |
TDatabaseLoginEvent = procedure (Database : TiBDatabase; LoginParams: TStrings) of object; property OnLogin: TDatabaseLoginEvent ; |
Pb |
Вызывается для регистрации пользователя при открытии соединения |
Компонент TiBDatabaseinfo
Компонент TiBDatabaseinfo обладает большим числом свойств и методов, содержащих разнообразные сведения о состоянии БД (табл. 18.8). Компонент очень прост в применении.
Для выбора базы данных (компонента TiBDatabase) используется стандартное свойство
property Database: TiBDatabase;
В процессе работы с базой данных свойствам компонента TiBDatabaseinfo передаются соответствующие значения. Разработчику необходимо лишь в нужных местах использовать значения требуемых свойств.
Таблица 18.8. Свойства и методы компонента TiBDatabaseinfo
Объявление |
Тип |
Описание |
Свойства |
||
property Allocation: Long; |
Ro |
Число выделенных страниц БД |
property BackoutCount: TStringList; |
Ro |
Число вариантов удаленных записей |
property BaseLevel: Long; |
Ro |
Версия базы данных (содержится во втором байте) |
property CurrentMemory: Long; |
Ro |
Объем памяти (в байтах), занятый сервером |
property Database: TIBDatabase; |
Pb |
Ссылка на компонент соединения с БД |
property DBFileName: String; |
RO |
Имя файла БД |
property DBIinplementationClass : Long; |
Ro |
Номер класса описания |
property DBImplementationNo: Long; |
Ro |
Номер описания |
property DBSiteName: String; |
Ro |
Имя сайта БД |
property DBSQLDialect: Long; |
Ro |
Номер диалекта SQL |
property DeleteCount: TStringList; |
Ro |
Число удалений с момента последнего обновления БД |
property ExpungeCount: TStringList; |
Ro |
Число удалений записей с момента последнего сохранения БД |
property Fetches: Long; |
Ro |
Число чтений из кэша |
property ForcedWrites: Long; |
Ro |
Режим чтения: 0 — асинхронное чтение; 1 — синхронное чтение. |
property InsertCount: TStringList; |
Ro |
Число добавлений в БД с момента последнего сохранения |
property Marks: Long; |
Ro |
Число выполненных записей в кэш |
property MaxMemory: Long; |
Ro |
Максимальный размер памяти, занимаемый БД с момента последнего сохранения |
property NoReserve: Long; |
RO |
Резервирование страниц: 0 — резервирование есть; 1 — резервирования нет |
property NumBuffers: Long; |
Ro |
Число выделенных буферов |
property ODSMajorVersion: Long; |
Ro |
Верхнее значение ODS |
property ODSMinorVersion: Long; |
Ro |
Нижнее значение ODS |
property PageSize: Long; |
Ro |
Размер страницы БД |
property PurgeCount: TStringList; |
Ro |
Общее число удаленных по любой причине записей |
property ReadldxCount: TStringList; |
Ro |
Число чтений через индексы с момента последнего сохранения |
property Readonly: Long; |
Ro |
0 — БД только для чтения; 1 — перезаписываемая БД |
property Reads: Long; |
Ro |
Число чтений из БД |
property ReadSeqCount: TStringList; |
Ro |
Число чтений таблиц целиком с последнего сохранения |
property Sweeplnterval: Long; |
Ro |
Число зафиксированных транзакций |
property UpdateCount: TStringList; |
Ro |
Число обновлений БД с момента последнего сохранения |
property UserNames: TStringList; |
Ro |
Список активных пользователей |
property Version: String; |
Ro |
Версия БД |
1 property Writes: Long; |
Ro |
Число постраничных записей |
Методы |
||
function Call (ErrCode: ISC STATUS; RaiseError: Boolean) : ISC STATUS; |
Pu |
Возвращает сообщение об ошибке по параметру ErrCode |
Компонент TIBDataSet
Компонент TIBDataSet предназначен для представления в приложениях наборов данных от сложных запросов (свойства и методы описаны в табл. 18.5). При этом набор данных остается редактируемым. Это достигается возможностью задать дополнительные запросы на удаление, изменение и добавление данных. Аналогичным образом работает стандартный компонент TUpdateSQL (см. гл. 22). Однако в компоненте TIBDataSet интегрированы одновременно и сам основной запрос, и вспомогательные запросы.
Основной запрос содержится в свойстве
property SelectSQL: TStrings;
Создание запроса облегчает простой редактор, вызываемый при щелчке на кнопке в поле редактирования свойства в Инспекторе объектов (рис. 18.3).
Каждому запросу (основному и вспомогательным) соответствует собственный объект TIBSQL, который подробно рассматривается ниже.
Таблица 18.5. Свойства и методы компонента TIBDataSet
Объявление |
Тип |
Описание |
Свойства |
||
property Buff erChunks: Integer; |
Pb |
Определяет число записей в буфере набора данных |
property DeleteSQL: TStrings; |
Pb |
Содержит текст запроса, обеспечивающего удаление записей из набора данных |
property InsertSQL: TStrings; |
Pb |
Содержит текст запроса, обеспечивающего добавление записей в набор данных |
property ModifySQL: TStrings; |
Pb |
Содержит текст запроса, обеспечивающего изменение записей из набора данных |
property Params: TIBXSQLDA; |
RO |
Структура API, содержащая параметры запроса |
property Prepared: Boolean; |
Ro |
Позволяет определить, подготовлен ли запрос к выполнению |
property QDelete: TIBSQL; |
Ro |
Объект запроса на удаление |
property Qlnsert: TIBSQL; |
Ro
|
Объект запроса на добавление |
property QModify: TIBSQL; |
Ro |
Объект запроса на изменение |
property QRefresh: TIBSQL; |
Ro |
Объект запроса на обновление |
property QSelect: TIBSQL; |
Ro |
Объект запроса на отбор данных |
property RefreshSQL: TStrings; |
Pb |
Содержит текст запроса, обеспечивающего обновление записей набора данных |
property SelectSQL: TStrings; |
Pb |
Содержит текст основного запроса набора данных |
type TIBSQLTypes = set of (SQLUnknown, SQLSelect, SQLInsert, SQLUpdate, SQLDelete, SQLDDL, SQLGetSegment, SQLPutSegment, SQLExecProcedure , SQLStartTransaction, SQLCommit, SQLRollback, SQLSelect ForUpdate, SQLSetGenerator) ; |
Ro
|
Возвращает тип основного запроса набора данных: SQLUnknown — неизвестный тип; SQLSelect, SQLInsert, SQLUpdate, SQLDelete — стандартные типы; SQLDDL — выражение DDL; SQLGetSegment, SQLPutSegment — запросы с полями BLOB; SQLExecProcedure, SQLStartTransaction, SQLCommit, SQLRollback — обработка транзакций; SQLSelectForUpdate — хранимая процедура, возвращающая набор данных; SQLSetGenerator — выполнение генератора |
Методы | ||
procedure Prepare; |
Pu |
Осуществляет подготовку всех запросов компонента к выполнению |
procedure UnPrepare; |
Pu |
Возвращает все запросы набора данных к исходному состоянию |
Методы-обработчики событий |
||
property DatabaseDisconnected: TNotifyEvent; |
Pb |
Вызывается после отключения базы данных |
property DatabaseDisconnecting: TNotifyEvent; |
Рb |
Вызывается во время отключения базы данных |
property DatabaseFree: TNotifyEvent; |
Pb
|
Вызывается после того, как компонент соединения освобождает занимаемую память |
Рис. 18.3. Редактор запроса компонента TIBDataSet
Компонент TIBQuery
Компонент TIBQuery выполняет все стандартные функции компонента запроса и наследует возможности класса TiBCustomDataSet.
Как и у остальных компонентов запросов, свойство
property SQL: TStrings;
содержит текст запроса и позволяет редактировать его. С этим свойством связан специализированный редактор (рис. 18.2).
Для просмотра текста запроса можно использовать свойство
property Text: string;
Параметры запроса хранятся в стандартном свойстве
property Params: TParams;
Общее число параметров запроса возвращает свойство
property ParamCount: Word;
При создании новых записей в редактируемых наборах данных компонентов запросов возникает проблема присвоения значений полям первичных индексов. Очевидно, что при сохранении новой записи в базе данных поле первичного индекса будет инкрементировано средствами сервера InterBase (соответствующими генератором и триггером). Однако получить это значение в приложении можно только сохранив изменения и обновив набор данных, что зачастую требует больших затрат ресурсов.
Для решения этой проблемы в компоненте TiBQuery используется свойство
property GeneratorField: TIBGeneratorField;
Редактор свойства (рис. 18.2) позволяет связать генератор с инкрементируемым полем.
Рис. 18.2. Редактор свойства GeneratorField компонента TiBQuery
Список Generator позволяет выбрать один из доступных генераторов базы данных. Список Field задает инкрементируемое поле набора данных. В строке Increment By определяется шаг прибавляемого значения поля.
Группа радиокнопок Apply Event определяет событие, при котором срабатывает генератор:
On New Record — при создании новой записи; On Post — при сохранении новой записи; On Server — генератор управляется сервером.Редактор свойства GeneratorField попросту присваивает значения полям экземпляра класса TIBGeneratorField.
Методы-обработчики событий полностью соответствуют классу TiBCustom-DataSet (см. табл. 18.2).
Компонент TIBSQL
Компонент TIBSQL предназначен для быстрого выполнения запросов SQL, поэтому не обеспечивает связи с компонентами представления данных (свойства и методы описаны в табл. 18.6).
Для обеспечения скорости выполнения запроса из компонента удалены все дополнительные механизмы, обслуживающие набор данных. Фактически компонент TIBSQL не имеет отношения к обычным компонентам доступа к данным, его непосредственным предком является класс icomponent, а не TDataSet. Поэтому он только передает через компонент соединения TiBDatabase запрос серверу и получает назад результат выполнения запроса.
Для повышения скорости компонент не обеспечивает полноценной навигации по набору данных. Перемещение по набору данных возможно только в прямом направлении (однонаправленный курсор).
Возвращаемые набором данных текущие значения полей содержатся не в привычном наборе объектов полей TField, а в объекте TIBXSQLDA (см. выше). Так как структура XSQLDA создается сервером при выполнении запроса, существенно уменьшается время открытия набора данных компонента.
Таблица 18.6. Свойства и методы компонента TIBSQL
Объявление |
Тип |
Описание |
Свойства |
||
property Bof: Boolean; |
Pu |
Значение True говорит о том, что курсор находится в начале набора данных |
property Database: TiBDatabase; |
Pb |
Определяет компонент соединения с базой данных |
property DBHandle: PISC DB_HANDLE; |
Pu |
Указатель API на объект базы данных |
property Eof : Boolean; |
Pu |
Значение True говорит о том, что курсор находится в конце набора данных |
property Fieldlndex: [FieldName: String]: Integer; |
Pu |
Список порядковых номеров полей по их именам |
property Fields [const Idx: Integer] : TIBXSQLVAR; |
Pu |
Индексированный список структур XSQLVAR, хранящих значения полей набора данных |
property GenerateParamNames : Boolean; |
Pu |
Установка свойства в значение True приводит к созданию списка имен параметров запроса в свойстве Params |
property GoToFirstRecordOnExecute : Boolean; |
Pb |
Значение True обеспечивает установку курсора на первую запись набора данных при его открытии |
property Handle: TISC STMT HANDLE; |
Pu |
Содержит указатель API на запрос |
property Open: Boolean; |
Pu |
Позволяет определить, открыт ли набор данных |
property ParamCheck: Boolean; |
Pb |
Позволяет определить, был ли заново сгенерирован список параметров запроса при изменении его текста во время выполнения |
property Params: TIBXSQLDA; |
PU |
Область дескрипторов запроса (см. выше) |
property Plan: String; |
Pu |
Содержит план запроса после его подготовки |
property Prepared: Boolean; |
Pu |
Значение True сообщает о том, что запрос готов к выполнению |
property RecordCount: Integer; |
Pu |
Возвращает число записей набора данных |
property RowsAf fected: Integer; |
Pu |
Возвращает число записей, обработанных запросом |
property SQL: TStrings; |
Pb |
Содержит текст запроса |
property SQLType: TIBSQLTypes read FSQLType; |
Pu |
Возвращает тип запроса (см. табл. 24.5) |
property Transaction: TIBTransaction; |
Pb |
Указывает на компонент транзакции |
property TRHandle: PISC_TR_HANDLE; |
Pu |
Содержит указатель API на транзакцию, в которой работает запрос |
property UniqueRelationName : String; |
Pu |
Возвращает уникальное внутреннее имя запроса |
Методы |
||
procedure Batchlnput ( InputOb ect: TIBBatchlnput); |
Pu |
Выполняет запрос с параметрами для переноса в объект Inputobject |
procedure BatchOutput (Output Object : TIBBatchOutput) ; |
Pu |
Выполняет запрос с параметрами для переноса в объект OutputObject |
function Call (ErrCode: ISC_STATUS; RaiseError: Boolean): ISC STATUS; |
Pu |
Возвращает текст сообщения об ошибке по ее коду ErrCode |
procedure CheckClosed; |
Pu |
Вызывает исключение, если набор данных открыт |
procedure CheckOpen; |
Pu |
Вызывает исключение, если набор данных закрыт |
procedure CheckValidStatement; |
Pu |
Вызывает исключение, если запрос некорректен |
procedure Close; |
Pu |
Закрывает набор данных |
function Current: TIBXSQLDA; |
Pu |
Ссылка на область дескрипторов запроса |
procedure ExecQuery; |
Pu |
Выполняет запрос |
function FieldByName [FieldName: String]: TIBXSQLVAR; |
Pu |
Возвращает структуру XSQLVAR по имени поля |
procedure FreeHandle; |
Pu
|
Освобождает ресурсы, занятые запросом |
function Next: TIBXSQLDA; |
Pu |
Возвращает область дескрипторов для следующей записи |
procedure Prepare; |
Pu |
Готовит запрос к выполнению |
Методы-обработчики событий |
||
property OnSQLChanging: TNotifyEvent; |
Pb |
Вызывается при изменении запроса |
Текст запроса задается обычным для всех компонентов запросов свойством SQL. Для выполнения запроса используется также знакомое свойство EXGCSQL. После этого можно обращаться к созданному компонентом набору данных. Значения полей из текущей записи доступны через свойство Fields. Обратите внимание, что это не объекты типа TFields, а структуры XSQLVAR из области дескрипторов.
Будут ли переданы значения полей в компонент, зависит от значения свойства GoToFirstRecordOnExecute.
Доступ к области дескрипторов осуществляется через свойство Current.
Переход к следующей записи выполняется методом Next. При этом обновляется область дескрипторов запроса.
Компонент TIBSQLMonitor
Компонент TIBSQLMonitor позволяет получать в клиентском приложении сообщения от сервера о выполняемых им операциях. Для этого используется метод-обработчик компонента
TSQLEvent = procedure(EventText: String) of object;
property OnSQL: TSQLEvent;
Параметр EventText содержит текст сообщения.
В компоненте соединения с БД можно установить перечень событий сервера, на которые будет реагировать компонент TIBSQLMonitor. Это делается при помощи свойства TraceFiags (см. выше). Вероятные значения множества означают контроль за следующими операциями:
tfQPrepare — подготовка запроса к выполнению (вызов метода Prepare); tfQExecute — выполнение запроса (вызов метода ExecSQL); tfQFetch — вызов запроса (вызов методов Open, Close); tfError — возникновение ошибки; tfstmt — все операции с запросами; tfconnect — подключение и отключение БД; tfTransact — выполнение транзакций; tfBlob — операции с данными BLOB; tfService — вспомогательные операции; tfMisc — любые операции, не учтенные вышеперечисленными значениями.Компонент TIBStoredProc
Компонент TIBStoredProc полностью соответствует стандартному прототипу, описываемому в гл. 12.
Имя хранимой процедуры задается свойством
property StoredProcName: String;
Список всех доступных на этапе выполнения хранимых процедур возвращает свойство
property StoredProcedureNames: TStrings;
Параметры хранимой процедуры содержатся в стандартном свойстве
property Params: TParams;
Общее число параметров возвращает свойство
property ParamCount: Word;
Свойство
property Prepared: Boolean;
позволяет определить, подготовлена ли хранимая процедура к выполнению. Методы-обработчики событий полностью соответствуют классу TiBCustom-DataSet (см. табл. 18.2).
Компонент TIBTable
Компонент TIBTable реализует все возможности стандартного компонента, инкапсулирующего таблицу (см. гл. 12). Дополнительно к ним можно обратить внимание на несколько полезных свойств и методов.
При выборе таблицы (свойство TableName) свойство
type
TIBTableType = (ttSystem, ttview);
TIBTableTypes = set of TIBTableType;
property TableTypes: TIBTableTypes;
определяет, какие таблицы доступны для выбора:
ttsystem — доступны системные таблицы и просмотры; ttview — доступны определенные пользователем просмотры.При открытии набора данных упорядочивание записей осуществляется в соответствии со значением свойства
property Defaultlndex: Boolean;
При значении True записи располагаются в порядке, определяемом первичным индексом таблицы БД.
Во время выполнения свойство
property Exists: Boolean;
позволяет определить, существует ли в базе данных таблица, имя которой определено свойством TableName.
Метод
procedure GotoCurrent(Table: TIBTable);
синхронизирует курсоры текущего набора данных и набора данных компонента, заданного параметром Table.
Методы-обработчики событий полностью соответствуют классу TiBCustom-DataSet (см. табл. 18.2).
Компонент TIBTransaction
Компонент TIBTransaction инкапсулирует средства управления транзакцией при работе с сервером InterBase. Для этого он должен быть связан с компонентом TiBDatabase при помощи своего свойства
property DefaultDatabase: TiBDatabase;
Один компонент транзакции может быть связан с несколькими компонентами TiBDatabase. Для этого необходимо задать один компонент транзакции в свойствах DefaultTransaction всех необходимых компонентов соединений (см. выше). Список всех связанных компонентов соединений содержится в свойстве
property Databases[Index: Integer]: TiBDatabase;
а их общее число возвращает свойство
property DatabaseCount: Integer;
Во время выполнения новое соединение может быть связано с транзакцией методом
function AddDatabase(db: TIBDatabase): Integer;
Или же, связь может быть отменена:
procedure RemoveDatabase(Idx: Integer);
А метод
procedure RemoveDatabases;
разрывает все установленные связи с компонентом TIBDatabase.
Индекс связанного соединения в списке Databases транзакции можно получить при помощи метода
function FindDatabase (db: TIBDatabase): Integer;
Например, если вам не известно ничего, кроме имени компонента, можно поступить так:
var i, FIndex: Integer;
...
for i := 0 to Forml.ComponentCount — 1 do
if Forml.Components[i].Name = 'IBDatabasel'
then FIndex :=
IBTransactionl.FindDatabase(TIBDatabase(Forml. Components[i]));
...
Соединение, заданное по умолчанию свойством DefaultDatabase, возвращает метод
function FindDefaultDatabase: TIBDatabase;
Транзакция может иметь набор параметров, задать которые можно при помощи свойства
property Params: TStrings;
аналогично компоненту TIBDatabase. Прямой доступ для чтения к буферу параметров транзакции Transaction Parameters Buffer (TPB) типа pchar обеспечивает свойство
property TPB: PChar;
Длина буфера содержится в свойстве
property TPBLength: Short;
Дескриптор транзакции представлен свойством
property Handle: TISC_TR_HANDLE;
После того как транзакция настроена, ее можно начать, сохранить или отменить.
Транзакция стартует при помощи метода
procedure StartTransaction;
При необходимости сохранить все сделанные в рамках текущей транзакции изменения используется метод
procedure Commit;
Если выполненные действия нужно отменить, применяется метод
procedure Rollback;
Для открытия и сохранения транзакции можно использовать традиционное свойство
property Active: Boolean;
После начала новой транзакции свойство
property InTransaction: Boolean;
принимает значение True, а после фиксации или отката — значение False.
При работе с сервером InterBase 6.0 можно использовать методы commit-Retaining и RollbackRetaining. В отличие от стандартных операций фиксации и отката транзакций, эти методы после передачи или отмены изменений оставляют текущую транзакцию открытой.
Если сервер перегружен и не откликается на транзакцию, то по истечении времени, заданного свойством
property IdleTimer: Integer;
выполняется действие, заданное свойством
type TTransactionAction = (taRollback, taCommit, taRollbackRetaining,
taCommitRetaining);
property DefaultAction: TTransactionAction;
taRollback — откат транзакции;
taCommit — фиксация транзакции;
taRollbackRetaining — отмена изменений без завершения транзакции (для сервера InterBase 6.0);
taCommitRetaining — фиксация изменений без завершения транзакции (для сервера InterBase 6.0).
Для компонента транзакции можно настроить ее автоматическое завершение при закрытии последнего открытого компонента, инкапсулирующего набор данных, связанного с тем же соединением, что и транзакция.
Для этого свойство
type TAutoStopAction = (saNone, saRollback, saCoramit,
saRollbackRetaining, saCommitRetaining); property AutoStopAction : TAutoStopAction;
не должно иметь значение saNone.
Остальные значения свойства выполняют следующие действия:
saRollback — откат транзакции; saCommit — фиксация транзакции; saRollbackRetaining — отмена изменений без завершения транзакции (для сервера InterBase 6.0); saCommitRetaining — фиксация изменений без завершения транзакции (для сервера InterBase 6.0). Метод
procedure CheckAutoStop;
выполняет действие, предусмотренное текущим значением свойства
AutoStopAction.
Диагностика состояния транзакции во время выполнения осуществляется группой специальных методов. В случае отрицательного результата все они генерируют исключение EiBClientError.
Метод
procedure CheckDatabasesInList;
проверяет, имеются ли в списке Databases связанные соединения. Метод
procedure ChecklnTransaction;
проверяет, открыта ли в данный момент транзакция. Метод
procedure CheckNotlnTransaction;
проверяет, закрыта ли в данный момент транзакция.
Единственный метод-обработчик транзакции
property OnldleTimer: TNotifyEvent;
вызывается по истечении срока ожидания выполнения транзакции, заданного свойством IdleTimer.
Компоненты доступа к данным
Так как компоненты InterBase Express используют для получения набора данных собственный механизм, то иерархия классов-предков включает только обязательный для всех наборов данных TDataSet класс TiBCustomDataSet, который, собственно, и инкапсулирует механизм доступа InterBase Express (см. рис. 12.1).
Для связи с базой данных компоненты InterBase Express применяют компоненты соединения TiBDatabase (см. выше). Для этого они используют свойство
property Database: TiBDatabase;
Доступ к связанной транзакции осуществляется через свойство
property Transaction: TIBTransaction;
Дополнительно к стандартным свойствам и методам, описываемым в гл. 12, класс TiBCustomDataSet имеет свойство
type TIBUpdateRecordTypes = set of (cusModified, cuslnserted, cusDeleted,
cusUnmodified, cusUninserted);
property UpdateRecordTypes: TIBUpdateRecordTypes;
cusModified — модифицированные записи;
cuslnserted — добавленные записи;
cusDeleted — удаленные записи;
cusUnmodified — немодифицированные записи;
cusUninserted — недобавленные записи.
Данное свойство определяет записи набора данных, на которые распространяются операции кэширования.
Свойство
property BufferChunks: Integer;
определяет число записей, которые компонент загружает в собственный локальный буфер для ускорения выполнения стандартных операций.
При использовании компонентов в приложениях необходимо учитывать некоторые особенности.
Обновление набора данных выполняется не при каждом сохранении изменений. Такое поведение компонента определяется свойством
property ForcedRefresh: Boolean;
которое по умолчанию имеет значение False.
Это ускоряет работу компонента. При необходимости выполнять обновление данных с максимальной частотой свойству ForcedRefresh нужно присвоить значение True.
В зависимости от настроек компонента, с ним можно выполнять различные виды операций редактирования, перечень которых содержится в свойстве "только для чтения":
type
TLiveMode = (Imlnsert, ImModify, ImDelete, ImRefresh);
TLiveModes = set of TLiveMode; property LiveMode: TLiveModes;
Так как все эти компоненты предназначены для работы с сервером, то изначально все они поддерживают режим кэширования изменений и имеют соответственные свойства, методы и методы-обработчики событий (табл. 18.2).
Таблица 18.2. Методы-обработчики событий класса TiBCustomDataSet
Объявление
|
Описание
|
property Af terDatabaseDisconnect: TNotifyEvent;
|
Выполняется после закрытия соединения с базой данных |
property AfterTransactionEnd: TNotifyEvent;
|
Выполняется по окончании транзакции, с которой связан данный набор данных |
property Bef oreDatabaseDisconnect: TNotifyEvent;
|
Выполняется перед закрытием соединения с базой данных |
property BeforeTransactionEnd: TNotifyEvent;
|
Выполняется перед окончанием транзакции, с которой связан данный набор данных |
property DatabaseFree: TNotifyEvent;
|
Выполняется при обнулении свойства Database компонента набора данных |
type
TIBUpdateAction = (uaFail, uaAbort, uaSkip, uaRetry, uaApplied, uaApply) ; TIBUpdateErrorEvent = procedure ( DataSet : TDataSet ; E: EDatabaseError; UpdateKind: TUpdateKind; var UpdateAction: TIBUpdateAction) of object; property OnUpdateError: TIBUpdateErrorEvent ; |
Вызывается при возникновении ошибки сохранения изменений в режиме кэширования |
type
TIBUpdateAction = (uaFail, uaAbort, uaSkip, uaRetry, uaApply, uaApplied); TIBUpdateRecordEvent = procedure ( DataSet : TDataSet ; UpdateKind: TUpdateKind; var UpdateAction: TIBUpdateAction) of object; property OnUpdateRecord: TIBUpdateRecordEvent ; |
Вызывается при сохранении изменений в режиме кэширования |
property TransactionFree: TNotifyEvent;
|
Выполняется при обнулении свойства Transaction компонента набора данных |
Для взаимодействия с сервером компоненты InterBase Express используют два класса, которые инкапсулируют важные структуры API InterBase. Эти структуры обеспечивают передачу серверу параметров запроса и возвращение результата выполнения запроса. Поэтому сначала рассмотрим классы TIBXSQLDA и TIBXSQLVAR, а затем перейдем к компонентам.
Механизм доступа к данным InterBase Express
Для компонентов InterBase Express соединение с сервером БД осуществляет компонент TIBDatabase.
Для создания приложения клиент/сервер необходимо не только иметь работающий сервер, но и инсталлировать на клиентских рабочих местах специальное программное обеспечение, выполняющее соединение клиентского приложения с сервером.
Механизм доступа к данным InterBase Express использует для обращений к серверу возможности клиентского ПО InterBase, которое должно быть инсталлировано на компьютере. Если с данного компьютера доступны базы данных какого-либо сервера на платформе InterBase, то рассматриваемые здесь компоненты могут обращаться к этому серверу. При этом не требуется использовать BDE или любой другой механизм доступа к данным.
Но в результате все компоненты InterBase Express, инкапсулирующие набор данных, должны обращаться к базе данных только через компонент соединения TIBDatabase. На самом деле эта особенность не является недостатком в клиентских приложениях, т. к. организация соединения через один специализированный компонент всячески приветствуется и является хорошим тоном в программировании.
Область дескрипторов XSQLDA
Запрос может иметь собственные параметры, которые должны содержаться в свойстве Params. Однако, в отличие от обычного компонента запроса, в InterBase Express это свойство представляет собой экземпляр класса TIBXSQLDA (табл. 18.3). Этот класс инкапсулирует одноименную структуру API InterBase — XSQLDA, обеспечивающую передачу параметров запросу и возврат результатов. Такая структура имеется у каждого запроса, который выполняется сервером InterBase и называется областью дескрипторов запроса (descriptors area).
Таблица 18.3. Свойства и методы класса TIBXSQLDA
Объявление |
Тип |
Описание |
Свойства |
||
property AsXSQLDA: PXSQLDA; |
Pu |
Ссылка на структуру XSQLDA |
property Count: Integer; |
Pu |
Возвращает число полей в структуре |
property Modified: Boolean; |
Pu |
Позволяет определить возможность редактирования полей структуры |
property Names: String; |
Pu |
Возвращает имена полей в структуре |
property RecordSize: Integer; |
Pu |
Возвращает размер записи структуры |
property Vars: [Idx: Integer]: TIBXSQLVAR; |
Pu |
Индексированный список структур XSQLVAR (см, ниже) |
Методы |
||
procedure AddName (FieldName: String; Idx: Integer); |
Pu |
Добавляет к структуре новое поле |
function ByName: [Idx: String] : TIBXSQLVAR; |
Pu |
Возвращает структуру XSQLVAR, инкапсулирующую отдельное поле результата запроса (см. ниже) |
Обработка событий
Клиентское приложение Delphi, работающее с сервером InterBase, имеет возможность отслеживать события, происходящие в базе данных и вызываемые другими процессами или приложениями. Для этого используется компонент TiBEvents. Он позволяет определить список необходимых событий и предоставляет разработчику простой механизм отслеживания возникающих на сервере событий. Свойства и методы компонента TiBEvents представлены в табл. 18.7.
Список событий задается свойством
property Events: TStrings;
в котором можно определить до 15 контролируемых событий.
Выбранные события необходимо зарегистрировать на сервере. Для этого применяется метод
procedure RegisterEvents;
Метод
procedure QueueEvents;
начинает процесс передачи сообщений от сервера.
При возникновении на сервере зарегистрированного события компонент вызывает метод-обработчик события
property OnEventAlert: TEventAlert;
TEventAlert = procedure) Sender: TObject; EventName: String; EventCount:
longint; var CancelAlerts: Boolean)
Параметр EventName содержит имя последнего произошедшего события.
Параметр EventCount содержит число заданных событий, произошедших с момента последнего вызова метода-обработчика.
Параметр CancelAlerts позволяет прервать процесс передачи сообщений приложению. Для этого необходимо присвоить параметру значение True.
Для возобновления работы компонента нужно снова использовать метод QueueEvents.
Таблица 18.7. Свойства и методы компонента TiBEvents
Объявление |
Тип |
Описание |
Свойства |
||
property Database: TIBDatabase; |
Pb |
Задает базу данных |
property Events: TStrings; |
Pb |
Список контролируемых событий |
property Queued: Boolean; |
Ro |
Значение True говорит о том, что процесс передачи сообщений работает |
property Registered: Boolean; |
Pb |
Определяет регистрацию сообщений на сервере |
Методы |
procedure CancelEvents; |
Pu |
Останавливает процесс передачи сообщений |
procedure QueueEvents; |
Pu |
Включает процесс передачи сообщений |
procedure RegisterEvents; |
Pu |
Проводит регистрацию сообщений на сервере |
procedure UnRegisterEvents; |
Pu |
Отменяет регистрацию сообщений на сервере |
Методы-обработчики событий |
||
property OnEventAlert: TEventAlert; TEventAlert = procedure (Sender : TObject; EventName: String; EventCount : longint ; var CancelAlerts : Boolean) |
Pb |
Вызывается при передаче сообщения от сервера компоненту |
В этой главе рассмотрены возможности
В этой главе рассмотрены возможности набора компонентов InterBase Express. Они обеспечивают быстрый и эффективный доступ к базам данных на серверах InterBase. Для доступа к данным этим компонентам не требуется ВОЕ, они используют только возможности API InterBase.
Часть компонентов обеспечивает быстрый переход со стандартных компонентов, инкапсулирующих набор данных, и повторяет функциональность компонентов ТТаblе, TQuery, TStoredProc и т.д.
Компоненты TIBSQL и TiBDataSet полностью основаны на механизмах API InterBase, работают еще эффективнее, но требуют нестандартных приемов работы.
Сервер баз данных InterBase и компоненты InterBase Express
На странице InterBase Палитры компонентов содержатся компоненты доступа к данным, адаптированные для работы с сервером InterBase и объединенные названием InterBase Express. Компоненты из набора InterBase Express предназначены для работы с сервером InterBase версии не ниже 5.5.
Их преимущество заключается в реализации всех функций за счет прямого обращения к API сервера InterBase. Благодаря этому существенно повысилась скорость работы компонентов.
Новые компоненты предоставляют разработчику новые возможности. Среди них:
улучшенное управление транзакциями (для этого теперь предназначен отдельный компонент TiBTransaction); новые компоненты доступа к данным, позволяющие лучше решать распространенные задачи программирования (компоненты TiBDataSet, TIBSQL); возможность получения сведений о состоянии базы данных без прямого обращения к ее системным таблицам (компонент TiBDatabaseinfo); отслеживание состояния процессов выполнения запросов (компонент TIBSQLMonitor).С точки зрения разработчика, за исключением нескольких новых свойств, методика использования этих компонентов в приложениях БД не отличается от стандартной методики (см. часть III). Любой новый компонент, инкапсулирующий набор данных, совершенно обычным образом через компонент TDataSource можно подключить к любому стандартному компоненту отображения данных.
В этой главе рассматриваются следующие вопросы:
соединение с сервером InterBase и полноценное управление транзакциями из клиентского приложения; что изменилось в стандартных компонентах доступа к данным; назначение и возможности новых компонентов доступа к данным; отслеживание процессов выполнения запросов на сервере из клиентского приложения; оценивание состояния базы данных; особенности переноса клиентских приложений, работающих с сервером InterBase, на новую компонентную базу.Структура XSQLVAR
Рассмотренная выше область дескрипторов содержит возвращаемый результат запроса. Массив значений каждого возвращаемого поля сохраняется в отдельной структуре XSQLVAR. Индексированный список таких структур в области дескрипторов представлен свойством
property Vars: [Idx: Integer]: TIBXSQLVAR
В целом, рассматриваемая структура соответствует объекту поля Delphi (см. гл. 13), о чем свидетельствует набор основных свойств и методов класса структуры, представленный в табл. 18.4.
Помимо представленных в таблице свойств, класс TIBXSQLVAR имеет ряд свойств, возвращающих значение в определенном формате: AsCurrency, AsDate, AsDateTime, AsDouble, AsFloat, Aslnt64, Aslnteger, AsLong, AsPointer, AsQuad, AsShort, AsString, AsTime, AsVariant.
Таблица 18.4. Свойства и методы класса TIBXSQLVAR
Объявление |
Тип |
Описание |
Свойства |
||
property AsXSQLVAR: PXSQLVAR; |
Pu |
Представляет значение поля как структуру XSQLVAR |
property Data: PXSQLVAR; |
Pu |
Ссылка на структуру XSQLVAR |
property Index: Integer; |
Pu |
Возвращает индекс структуры в области дескрипторов |
property IsNull: Boolean; |
Pu |
Позволяет определить наличие данных в структуре |
property IsNullable: Boolean; |
Pu |
Позволяет определить, может ли структура иметь значение |
property Modified: Boolean; |
PU |
Позволяет определить, изменялось ли значение в структуре |
property Size: Integer; |
Pu |
Максимальный размер данных в байтах |
property SQLType: Integer; |
Pu |
Возвращает индекс API параметра |
property Value: Variant; |
Pu |
Содержит возвращаемое значение |
Методы |
||
procedure Assign (Source: TIBXSQLVAR) ; |
Pu |
Присваивает объект, передаваемый в параметре, данному объекту |
procedure LoadFromFile (const FileName: String); |
Pu |
Загружает из файла данные в поле BLOB |
procedure LoadFromStream(Stream: TStream) ; |
PU |
Загружает из потока данные в поле BLOB |
procedure SaveToFile (const FileName: String); |
Pu |
Сохраняет в файле данные из поля BLOB |
procedure SaveToStream (Stream: TStream) ; |
рu |
Сохраняет в потоке данные из поля BLOB |