Класс TBDEDataSet
Этот класс является потомком класса TDataSet, его значение трудно переоценить: именно TBDEDataSet обеспечивает работоспособность важнейших механизмов набора данных за счет обращения к функциям BDE (табл. 16.6). Например, класс TBDEDataSet перекрывает абстрактные методы своего предка TDataSet, отвечающие за такие важнейшие операции, как чтение данных и сохранение изменений в базе данных, навигация по записям набора данных, фильтрация.
Напомним, что все эти механизмы не созданы "с нуля", а только дополнены обращениями к функциям BDE в необходимых местах методов, изначально описанных в классе TDataSet. Например, для обеспечения фильтрации записей набора данных к классу добавлено новое свойство:
type
TFilterOption = (foCaselnsensitive, foNoPartialCompare);
TFilterOptions = set of TFilterOption;
property FilterOptions: TFilterOptions;
Оно определяет дополнительные параметры отбора записей по фильтру (чувствительность к регистру символов и отбор по текстовому шаблону).
Дополнительно к существующим добавлен механизм кэширования изменений. Теперь все вносимые пользователем изменения могут накапливаться в специальном буфере, а их передачей в базу данных можно управлять.
Примечание
Эта возможность очень полезна при создании клиентских приложений в архитектуре клиент/сервер и играет ключевую роль при обеспечении возможности редактирования наборов данных сложных запросов SQL.
Дополнительно к методам работы с полями класса TDataSet добавлены функции использования полей в формате BLOB.
Для обеспечения использования функций API BDE на программном уровне добавлено свойство, содержащее дескриптор курсора, соответствующего текущей записи набора данных:
type HDBICur: Longint;
property Handle: HDBICur;
Также класс обеспечивает возможность программного управления вторичными индексами набора данных в зависимости от типа таблицы базы данных.
Таблица 16.6. Свойства и методы класса TBDEDataSet
Объявление |
Тип |
Описание |
Свойства |
||
property BlockReadSize: Integer; |
Pu |
Определяет размер буфера при блочном чтении данных. Такой режим используется для быстрого перемещения по большим массивам данных. Если значение свойства больше нуля, навигация по набору данных осуществляется без изменения состояния компонентов отображения данных и вызова методов-обработчиков событий |
property CacheBlobs: Boolean; |
Pu |
Разрешает использование буфера памяти для данных типа BLOB |
property CachedUpdates: Boolean; |
Pb |
Включает или отключает режим кэширования изменений в наборе данных. Используется в клиентских приложениях архитектуры клиент/сервер |
property CanModify: Boolean; |
Pu, Ro |
Если набор данных позволяет делать изменения, свойство возвращает True, иначе — False |
property Explndex: Boolean; |
Pu, Ro |
Показывает, используются ли в наборе данных индексы dBASE |
property Filter: string; |
Pb, Ro |
Содержит выражение для фильтра набора данных |
property Filtered: Boolean; |
Pb, Ro |
Управляет включением фильтра набора данных |
TFilterOption = (foCaselnsensitive, foNoPartialCompare) ; property FilterOptions: TFilterOptions; |
Pb |
Определяет параметры фильтра:
|
type HDBICur: Longint; property Handle: HDBICur; |
Pu, Ro |
Указатель на курсор ВОЕ, связанный с текущей записью набора данных |
property KeySize: Word; |
Pu, Ro |
Содержит размер ключа для текущего индекса набора данных |
type TLocale: Pointer; property Locale: TLocale; |
Pu, Ro |
Указатель на языковый драйвер ВОЕ |
property RecNo: Longint; |
Pu |
Номер текущей записи набора данных |
property RecordCount: Longint; |
Ro |
Содержит число записей в наборе данных |
property RecordSize: Word; |
Ro |
Содержит размер одной записи набора данных |
property UpdateObject: TDataSetUpdateObject; |
Pu |
Экземпляр объекта TUpdateObject, используемого при кэшировании изменений |
type TUpdateRecordTypes = set of (rtModified, rtlnserted, rtDeleted, rtUnmodified) ; property UpdateRecordTypes : TUpdateRecordTypes ; |
PU |
Определяет видимость записей в режиме кэширования изменений в зависимости от их состояния:
|
property UpdatesPending: Boolean; |
Ro |
Значение True говорит о том, что буфер изменений при кэшировании содержит не сохраненные на сервере изменения |
Методы |
||
procedure ApplyUpdates; |
Pu |
Записывает изменения из буфера в базу данных в режиме кэширования |
function BookmarkValid (Bookmark : TBookmark): Boolean; overrider |
Pu
|
Проверяет существование экземпляра закладки, передаваемого в параметре Bookmark |
procedure Cancel; |
Pu |
Отменяет все изменения, сделанные в текущей записи с момента последнего сохранения |
procedure CancelUpdates; |
Pu |
Отменяет все изменения, сделанные с момента последней записи в базу данных и очищает буфер в режиме кэширования |
procedure CommitUpdates; |
Pu |
Очищает буфер изменений в режиме кэширования |
function CompareBookmarks (Bookmarkl, Bookmark2: TBookmark): Integer; |
Pu |
Проверяет идентичность закладок, указанных в параметрах Bookmark1 и Bookmark2. При значении сигнализирует о наличии отличий в двух закладках |
function ConstraintCallBack (Req: DsInfoReq; var ADataSources : DataSources) : DBIResult; stdcall; |
Pu |
Обеспечивает доступ к функциям ограничения данных API BDE |
function ConstraintsDisabled: Boolean; |
Pu |
Показывает, включены или отключены ограничения данных |
function CreateBlobStream ( Field : TField; Mode: TblobStreamMode) : TStream; override; |
Pu |
Создает поток для чтения/записи данных типа BLOB |
procedure DisableConstraints; |
Pu |
Отключает ограничения данных |
procedure EnableConstraints; |
Pu |
Включает ограничения данных |
procedure FetchAll; |
Pu |
Переносит все изменения из буфера и восстанавливает все записи от текущей позиции до конца набора данных |
procedure FlushBuffers; |
Pu |
Передает в базу данных все изменения из буфера записи |
function GetBlobFieldData (FieldNo: Integer; var Buffer: TblobByteData): Integer; override; |
Pu |
Читает все данные BLOB из поля FieldNo В буфер Buffer |
function GetCurrentRecord (Buffer : PChar) : Boolean |
Pu |
Помещает текущую строку в буфер Buffer |
procedure Getlndexlnfo; |
Pu |
Обновляет информацию о текущем индексе набора данных |
function IsSequenced: Boolean; override; |
Pu |
Определяет, поддерживает ли таблица БД нумерацию последовательности записей. В классе TDataSet всегда возвращает True, т. к. абстрактный набор данных свободен от конкретной реализации БД и всегда нумерует записи |
function Locate (const KeyFields: string; const KeyValues : Variant; Options: TlocateOptions) : Boolean; |
Pu |
Осуществляет поиск в наборе данных. Параметр KeyFields содержит список полей, по которым ведется поиск. Параметр KeyValues содержит значения полей для поиска. Параметр Options определяет условия поиска. Если запись найдена, курсор набора данных устанавливается на эту запись и возвращается True (см. гл. 14) |
function Lookup (const KeyFields: string; const KeyValues : Variant; const ResultFields: string): Variant; |
Pu |
Осуществляет поиск в наборе данных. Возвращает массив значений требуемых полей найденной записи. Параметры аналогичны методу Locate (см. гл. 14) |
procedure Post; override; |
Pu |
Пересылает сделанные в текущей записи изменения в базу данных |
procedure RevertRecord; |
Pu |
Отменяет все изменения в текущей строке при работающем буфере изменений |
procedure Translate (Src, Dest : PChar; ToOem: Boolean); override; |
Pu |
Форматирует текст. Если параметр ToOem = True, текст Src в формате ANSI переводится в текст Dest в формате OEM и наоборот |
function UpdateStatus: TUpdateStatus; |
Возвращает тип сохраняемых в буфере изменений данных (см. табл. 16.1) |
|
Методы-обработчики событий |
||
TUpdateAction = (uaFail, uaAbort, uaSkip, uaRetry, uaApplied); TUpdateErrorEvent = procedure (DataSet: TDataSet; E: EDatabaseError; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction) of object; property OnUpdateError: TUpdateErrorEvent; |
Pu |
Вызывается при возникновении ошибки переноса кэшированных в буфере изменений в таблицу базы данных |
type TUpdateAction = (uaFail, uaAbort, uaSkip, uaRetry, uaApplied) ; TUpdateRecordEvent = procedure ( DataSet : TDataSet ; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction) of object; property OnUpdateRecord : TUpdateRecordEvent ; |
Pu |
Вызывается при сохранении кэшированных в буфере изменений для отдельной записи. Применяется для организации дополнительного управления этим процессом, например для контроля какого-либо конкретного значения |