Самоучитель по Delphi 7 для профессионалов

         

Информация о состоянии базы данных



В процессе отладки и выполнения клиентских приложений для сервера 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 компонента набора данных

Возможности компонентов TIBTable, TIBQuery, TIBStoredProc, TIBUpdateSQL мало чем отличаются от стандартных, описанных в гл. 12.

Для взаимодействия с сервером компоненты 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