Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 Практический раздел.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
5.18 Mб
Скачать

Лабораторная работа №29

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

Цель работы: Изучить технологию доступа к данным InterBase Express в среде Delphi.

Время работы: 2 учебных часа.

Правила по ТБ: Общие.

Оборудование рабочего места: Практикум, ПК.

Программное обеспечение: Windows, MS Office, Delphi

Вопросы входного контроля:

    1. Расскажите, какие компоненты необходимы для создания простых отчетов.

  1. Расскажите, как подключать компоненты для создания отчетов.

  2. Расскажите, чем отличается создание простых и сложных отчетов

  3. Перечислите форматы файлов, в которые можно получить отчет.

  4. Расскажите, как работать в подпрограмме Rave Report.

  5. Перечислите отличия QuickReport и Rave Report

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Механизм доступа к данным InterBase Express

Для компонентов InterBase Express соединение с сервером БД осуществляет компонент TIBDatabase.

Для создания приложения клиент/сервер необходимо не только иметь работающий сервер, но и инсталлировать на клиентских рабочих местах специальное программное обеспечение, выполняющее соединение клиентского приложения с сервером. Механизм доступа к данным InterBase Express использует для обращений к серверу возможности клиентского ПО InterBase, которое должно быть инсталлировано на компьютере. Если с данного компьютера доступны базы данных какого-либо сервера на платформе InterBase, то рассматриваемые здесь компоненты могут обращаться к этому серверу. При этом не требуется использовать BDE или любой другой механизм доступа к данным.

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

Компонент TIBDatabase

Так как для доступа к базе данных компонентам InterBase Express не требуется BDE, то для создания соединения используется всего одно свойство DatabaseName. В нем необходимо указать полный путь (включая имя сервера) к выбранному файлу БД с расширением gdb. Для этого можно воспользоваться стандартным диалогом выбора файла при щелчке на кнопке свойства в Инспекторе объектов.

Компонент имеет собственный редактор, который позволяет задать значения основных свойств, обеспечивающих соединение с базой данных (рис. 29.1).

Рисунок 29.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 представлены в табл. 29.1.

Таблица 29.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

 

Вызывается для регистрации пользователя при открытии  соединения

Компонент 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 — отмена изменений без завершения транзакции;

 taCommitRetaining — фиксация изменений без завершения транзакции.

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

Для этого свойство

type TAutoStopAction = (saNone, saRollback, saCoramit,

 saRollbackRetaining, saCommitRetaining);

property AutoStopAction : TAutoStopAction;

не должно иметь значение saNone.

Остальные значения свойства выполняют следующие действия:

  •  saRollback — откат транзакции;

  •  saCommit — фиксация транзакции;

  •  saRollbackRetaining — отмена изменений без завершения транзакции;

  •  saCommitRetaining — фиксация изменений без завершения транзакции.

Метод

procedure CheckAutoStop;

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

AutoStopAction.

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

Метод

procedure CheckDatabasesInList;

проверяет, имеются ли в списке Databases связанные соединения. Метод

procedure ChecklnTransaction;

проверяет, открыта ли в данный момент транзакция. Метод

procedure CheckNotlnTransaction;

проверяет, закрыта ли в данный момент транзакция.

Единственный метод-обработчик транзакции

property OnldleTimer: TNotifyEvent;

вызывается по истечении срока ожидания выполнения транзакции, заданного свойством IdleTimer.

Компоненты доступа к данным

Так как компоненты InterBase Express используют для получения набора данных собственный механизм, то иерархия классов-предков включает только обязательный для всех наборов данных TDataSet класс TiBCustomDataSet, который, собственно, и инкапсулирует механизм доступа InterBase Express.

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

Так как все эти компоненты предназначены для работы с сервером, то изначально все они поддерживают режим кэширования изменений и имеют соответственные свойства, методы и методы-обработчики событий (таблица 29.2).

Таблица 29.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 мало чем отличаются от стандартных.

Для взаимодействия с сервером компоненты InterBase Express используют два класса, которые инкапсулируют важные структуры API InterBase. Эти структуры обеспечивают передачу серверу параметров запроса и возвращение результата выполнения запроса. Поэтому сначала рассмотрим классы TIBXSQLDA и TIBXSQLVAR, а затем перейдем к компонентам.

Область дескрипторов XSQLDA

Запрос может иметь собственные параметры, которые должны содержаться в свойстве Params. Однако, в отличие от обычного компонента запроса, в InterBase Express это свойство представляет собой экземпляр класса TIBXSQLDA (таблица 29.3). Этот класс инкапсулирует одноименную структуру API InterBase — XSQLDA, обеспечивающую передачу параметров запросу и возврат результатов. Такая структура имеется у каждого запроса, который выполняется сервером InterBase и называется областью дескрипторов запроса (descriptors area).

Таблица 29.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, инкапсулирующую отдельное поле результата запроса (см. ниже)

 

Структура XSQLVAR

Рассмотренная выше область дескрипторов содержит возвращаемый результат запроса. Массив значений каждого возвращаемого поля сохраняется в отдельной структуре XSQLVAR. Индексированный список таких структур в области дескрипторов представлен свойством

property Vars: [Idx: Integer]: TIBXSQLVAR

В целом, рассматриваемая структура соответствует объекту поля Delphi, о чем свидетельствует набор основных свойств и методов класса структуры, представленный в табл. 29.4.

Помимо представленных в таблице свойств, класс TIBXSQLVAR имеет ряд свойств, возвращающих значение в определенном формате: AsCurrency, AsDate, AsDateTime, AsDouble, AsFloat, Aslnt64, Aslnteger, AsLong, AsPointer, AsQuad, AsShort, AsString, AsTime, AsVariant.

Таблица 29.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

 

Компонент TIBTable

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

При выборе таблицы (свойство 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 (см. таблицу 29.2).

Компонент TIBQuery

Компонент TIBQuery выполняет все стандартные функции компонента запроса и наследует возможности класса TiBCustomDataSet.

Как и у остальных компонентов запросов, свойство

property SQL: TStrings;

содержит текст запроса и позволяет редактировать его. С этим свойством связан специализированный редактор (рис. 18.2). Для просмотра текста запроса можно использовать свойство

property Text: string;

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

property Params: TParams;

Общее число параметров запроса возвращает свойство

property ParamCount: Word;

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

Для решения этой проблемы в компоненте TiBQuery используется свойство

property GeneratorField: TIBGeneratorField;

Редактор свойства (рис. 18.2) позволяет связать генератор с инкрементируемым полем.

Рисунок 29.2Редактор свойства GeneratorField компонента TiBQuery

Список Generator позволяет выбрать один из доступных генераторов базы данных. Список Field задает инкрементируемое поле набора данных. В строке Increment By определяется шаг прибавляемого значения поля.

Группа радиокнопок Apply Event определяет событие, при котором срабатывает генератор:

  •  On New Record — при создании новой записи;

  •  On Post — при сохранении новой записи;

  •  On Server — генератор управляется сервером.

Редактор свойства GeneratorField попросту присваивает значения полям экземпляра класса TIBGeneratorField.

Методы-обработчики событий полностью соответствуют классу TiBCustom-DataSet (см. таблицу 29.2).

Компонент TIBDataSet

Компонент TIBDataSet предназначен для представления в приложениях наборов данных от сложных запросов (свойства и методы описаны в табл. 18.5). При этом набор данных остается редактируемым. Это достигается возможностью задать дополнительные запросы на удаление, изменение и добавление данных. Аналогичным образом работает стандартный компонент TUpdateSQL. Однако в компоненте TIBDataSet интегрированы одновременно и сам основной запрос, и вспомогательные запросы. Основной запрос содержится в свойстве

property SelectSQL: TStrings;

Создание запроса облегчает простой редактор, вызываемый при щелчке на кнопке в поле редактирования свойства в Инспекторе объектов (рисунок 29.3).

Каждому запросу (основному и вспомогательным) соответствует собственный объект TIBSQL, который подробно рассматривается ниже.

Таблица 29.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

Вызывается после того, как компонент соединения освобождает занимаемую память

 

Рисунок 29.3Редактор запроса компонента TIBDataSet

Компонент TIBSQL

Компонент TIBSQL предназначен для быстрого выполнения запросов SQL, поэтому не обеспечивает связи с компонентами представления данных (свойства и методы описаны в таблице 29.6).

Для обеспечения скорости выполнения запроса из компонента удалены все дополнительные механизмы, обслуживающие набор данных. Фактически компонент TIBSQL не имеет отношения к обычным компонентам доступа к данным, его непосредственным предком является класс icomponent, а не TDataSet. Поэтому он только передает через компонент соединения TiBDatabase запрос серверу и получает назад результат выполнения запроса.

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

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

Таблица 29.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. При этом обновляется область дескрипторов запроса.

Обработка событий

Клиентское приложение Delphi, работающее с сервером InterBase, имеет возможность отслеживать события, происходящие в базе данных и вызываемые другими процессами или приложениями. Для этого используется компонент TiBEvents. Он позволяет определить список необходимых событий и предоставляет разработчику простой механизм отслеживания возникающих на сервере событий. Свойства и методы компонента TiBEvents представлены в таблице 29.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.

Таблица 20.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

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

 

СОДЕРЖАНИЕ И ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

    1. Изучить теоретические введения.

  1. Создать новый проект.

  2. Поместить на форму основные компоненты для использования технологии доступа к данным InterBase Express.

  3. Подключить базу данных и связать компоненты для использования технологии.

  4. Написать код, который позволяет манипулировать данными с использованием методов и свойств технологии InterBase Expres.

  5. Проверить работоспособность подключения.

  6. Проверить работу всего проекта.

  7. Продемонстрировать преподавателю работу разработанного образца проекта.

  8. Получить от преподавателя индивидуальное задание и создать проект (по аналогии) для выполнения индивидуального задания.

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

Вопросы выходного контроля:

  1. Расскажите, какие компоненты необходимы для использования технологии InterBase Express.

  2. Расскажите, как подключать компоненты использования технологии InterBase Express.

  3. Перечислите все компоненты, которые могут использоваться в технологии InterBase Express.

  4. Охарактеризуйте некоторые методы и свойства компонентов для использования технологии InterBase Express.

  5. Перечислите наиболее часто используемые компоненты для работы с БД.