Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектирование БД в Delphi ВТиП.doc
Скачиваний:
53
Добавлен:
17.03.2016
Размер:
3.62 Mб
Скачать
      1. Методы класса tCustomAdoDataSet

Своеобразной особенностью ADO-наборов являются инкапсулированные в них методы SaveToFile и LoadFromFile. В ADO эти методы используются в качестве одного из возможных механизмов обмена данными между разными компьютерами, а также для отложенной обработки данных. Перед вызовами этих методов ADО-набор должен быть закрыт. После успешного вызова LoadFromFile набор автоматически открывается в том состоянии, в котором он был сохранен методом SaveToFile. ADO-наборы можно сортировать по закладкам (метод FilterOnBookmarks). Например:

procedure TForm1.Button1Click(Sender: TObject);

var

BM1, BM2: TBookmarkStr;

begin

with ADODataSet1 do begin

BM1 := Bookmark;

MoveBy(3);

BM2 := Bookmark;

FilterOnBookmarks([BMl, BM2]);

end;

end;

Для работы в многопользовательском режиме может оказаться полезным метод Clone, с помощью которого уже созданный НД дублируется в вызывающий. Например:

ADOTable1.Open; // Создан исходный НД

ADOTable2.Clone(ADOTablel, ltReADOnly); // Создан дубликат в НД

// ADOTable2

Для ADO-наборов определен метод Requery, с помощью которого программист может обновить НД. Его действие фактически эквивалентно последовательному использованию методов Close и Open. Особенностью является то обстоятельство, что влияющие на НД свойства, такие как CursorLocation, CursotType, LockTable и т. п., остаются неизменными, в то время как в промежутке между использованием методов Close и Open эти свойства можно изменить и тем самым повлиять на результирующий НД.

Весьма необычным является метод Seek, осуществляющий поиск записи по заданному значению (значениям) ключевого поля (полей). В принципе он реализует те же действия, что и метод Locate, но отличается от него несколькими важными особенностями. Во-первых, для Locate не имеет значения, индексировано ли Поле (поля), по которому (которым) ищутся записи. В то же время Seek ищет только по индексированным полям, которые к тому же должны быть указаны в свойстве IndexNames или IndexFields. Далее, для Locate курсор не перемещается, если поиск неудачен, для Seek — перемещается всегда в зависимости от указанного параметра SeekOption (если запись не найдена, курсор перемещается: в начало НД, в конец НД, непосредственно перед искомой записью или сразу за ней). И, наконец, Seek не может вести поиск с игнорированием возможной разницы в регистре букв или по частичному совпадению поисковых значений. К сожалению, многие провайдеры OLE DB не допускают установки значений свойства IndexNames или IndexFields и, таким образом, не поддерживают метод Seek.

С помощью метода Supports можно проверить различные характеристики набора, в частности, поддерживает ли он метод Seek:

ADOTable1.Open;

if Supports([coSeek]) then

ADOTable1.Seek(90001, soAfterEQ)

else if Supports ([coLocate]) then

ADOTable1.Locate('Number', 90001, [] );

      1. События класса tCustomAdoDataSet

Некоторые события используют следующие типы данных, определяющие статус и смысл события:

type TEventStatus = (esOK, esErrorsOccured, esCantDeny, esCancel,

esUnwantedEvent);

Здесь:

  • esOK — нет ошибок;

  • esErrorsOccured — событие вызвало ошибки;

  • esCantDeny — ожидаемую связь нельзя разорвать;

  • esCancel — ожидаемую связь можно разорвать до ее активизации;

  • esUnwantedEvent — блокирует связанные события.

type TEventReason = (erAddNew, erDelete, erUpdate, erUndoUpdate,

erUndoAddNew, erUndoDelete, erRequery,

erResynch, erClose, erMove, erFirstChange,

erMoveFirst, erMoveNext, erMovePrevious,

erMoveLast);

Здесь:

  • erAddNew —добавлена запись;

  • erDelete — удалена запись;

  • erUpdate — запись изменена;

  • erUndoUpdate — произошел откат изменений записи;

  • erUndoAddNew — произошел откат вставки записи;

  • erUndoDelete — произошел откат удаления записи;

  • erRequery — к НД был применен метод Requere;

  • erResynch — к НД был применен метод Resync;

  • erClose — НД был закрыт;

  • erMove — курсор сместился к другой записи;

  • erFirstChange — произошло первое изменение НД;

  • erMoveFirst — курсор сместился к первой записи;

  • erMoveNext — курсор сместился к следующей записи;

  • erMovePrevious — курсор сместился к предыдущей записи;

  • erMoveLast — курсор сместился к последней записи.

Особенностью события OnEndOfRecordset является то, что оно предшествует событиям BeforeScroll и AfterScroll. В обработчике события нельзя проверять конец НД с помощью функции EOF, так как сам НД может быть частично не наполнен, если наполнение его записями идет в асинхронном режиме.

Обработчик события OnFetchProgressEvent обычно используется при длительном обращении к БД в асинхронном режиме для индикации процесса. Например:

proedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: integer;

var EventStatus: TEventStatus);

begin

Caption := 'Процент выполнения: ' +

IntToStr(Trunc(Progress / MaxProgress * 100)) + '%' ;

Application.ProcessMessages;

end;