Класс TCustomADODataSet

   
На этом шаге мы рассмотрим класс TCustomADODataSet.

   
На странице ADO палитры компонентов Delphi, кроме компонентов соединения есть
стандартные компоненты, инкапсулирующие набор данных и адаптированные для работы
с хранилищем данных ADO. Это компоненты:

  • TADODataSet - универсальный набор данных;
  • TАDOTаblе - таблица БД;
  • TADOQuery - запрос SQL;
  • TADOStoredProc - хранимая процедура.

   
Как и положено для компонентов, инкапсулирующих набор данных, их общим предком является класс
TDataSet, предоставляющий базовые функции управления набором данных.

   
Компоненты ADO обладают обычным набором свойств и методов, а необходимый для доступа к
данным через ADO механизм наследуют от своего общего предка - класса TCustomADODataSet.
Кроме этого, класс TCustomADODataSet содержит ряд общих для всех потомков свойств и методов,
поэтому сначала мы рассмотрим класс TCustomADODataSet и только
потом перейдем к компонентам ADO.

   
Класс TCustomADODataSet инкапсулирует механизм доступа к хранилищу данных через ADO.
Этот класс наполняет абстрактные методы общего предка TDataSet функциями конкретного
механизма доступа к данным.

   
Рассмотрим некоторые свойства и методы класса TCustomADODataSet,
обеспечивающие работу с ADO.
Свойство BlockReadSize

   
С помощью свойства BlockReadSize можно задать такой режим работы, когда навигация по данным не
приводит к изменениям в связанных с набором визуализирующих компонентах. В этом случае навигация по набору
данных будет проходить значительно быстрее. Свойство BlockReadSize позволяет организовать блочную
пересылку данных. Оно задает число записей, помещаемых в один блок. По умолчанию блочная пересылка не
используется и значение свойства равно 0.
Свойства MaxRecords и RecordCount

   
Максимальный размер набора данных можно ограничить используя свойство
MaxRecords, которое
задает максимальное число записей набора данных. По умолчанию свойство имеет значение 0 и набор данных
не ограничен.
Общее число записей набора данных на этот момент возвращает свойство RecordCount.
Свойство LockType

   
Перед открытием набора данных можно установить тип используемой при редактировании записей блокировки.
Для этого применяется свойство LockType.
Свойство CursorLocation

   
Для набора данных ADO в зависимости от его назначения можно выбрать тип и местоположение
используемого курсора. Местоположение курсора задается свойством CursorLocation. Курсор
может находиться на сервере (clUseServer) или на клиенте (clUseClient).
Серверный курсор используется при работе с большими наборами данных, которые нецелесообразно пересылать
клиенту целиком. При этом несколько снижается скорость
работы клиентского набора данных. Клиентский курсор обеспечивает передачу набора данных клиенту.
Это положительно сказывается на быстродействии, но такой курсор разумно использовать только для небольших
наборов данных, не загружающих канал связи с сервером.
Свойство MarshalOptions

   
При использовании клиентского курсора необходимо дополнительно установить свойство MarshalOptions,
которое управляет обменом данных клиента с сервером. Если соединение с сервером быстрое, можно
использовать значение moMarshalAll, разрешающее возврат серверу всех записей набора данных.
В противном случае для ускорения работы компонента можно применить свойство moMarshalModifiedOnly,
обеспечивающее возврат только модифицированных клиентом записей.
Свойство IndexFieldNames

   
Одним из преимуществ курсоров, работающих на стороне клиента, является возможность создания
локальных, или клиентских, индексов. Пусть имеется набор данных ADO с клиентским курсором,
и этот набор соединен с таблицей Players. Пусть к этому набору подключена сетка DBGrid.
Если свойству IndexFieldNames присвоить значение Nom, то сетка немедленно отобразит записи,
упорядочив их в соответствии со значением поля Nom. Важно отметить, что для формирования
индекса ADO не читает заново данные из источника. Индекс формируется на основе данных,
хранящихся в памяти. Благодаря этому, во-первых, индекс формируется достаточно быстро, во-вторых, не
создается никакой дополнительной нагрузки на сеть. В противном случае одни и те же данные пришлось бы раз
за разом передавать через сеть в различном порядке сортировки.

   
Свойство IndexFieldNames обладает некоторыми другими интересными возможностями.
Например, если присвоить этому свойству значение 'TeamName; Fam', то записи сначала будут
отсортированы в соответствии с названием команды, а затем в соответствии с фамилиями игроков.
Если присвоить свойству IndexFieldNames значение 'Nom DESC', то записи будут отсортированы
в порядке убывания значений.
Свойство Sort

   
Для сортировки записей в свойство Sort ADO-наборов помещают список полей
сортировки, разделенных запятыми. Каждое поле может дополнительно снабжаться признаками
ASCENDING (ASC) или
DESCENDING (DESC) для указания соответственно восходящего или нисходящего порядка сортировки.
Например:

   ADOTable1.Sort:='Fam ASC';   

После выполнения данного кода записи в таблице будут отсортированы по полю Fam по возрастанию.
Свойство RecordStatus

   
Класс TCustomADODataSet обладает возможностями, которые позволяют
отслеживать состояние каждой записи.
Для текущей записи набора данных можно определить ее состояние. Для этого предназначено свойство
RecordStatus. Возможные значения:

  • rsOK - запись успешно сохранена;
  • rsNew - запись добавлена;
  • rsModified - запись была изменена;
  • rsDeleted - запись удалена;
  • rsUnmodified - запись без изменений;
  • rsInvalid - запись не может быть сохранена из-за неверной закладки;
  • rsMultipleChanges - запись не может быть сохранена из-за множественных изменений;
  • rsPendingChanges - запись не может быть сохранена из-за ссылки на несохраненные изменения;
  • rsCanceled - операция с записью была отменена;
  • rsCantRelease - запись заблокирована;
  • rsConcurrencyViolation - запись не может быть сохранена из-за типа блокировки;
  • rsIntegrityViolation - нарушена ссылочная целостность;
  • rsMaxChangesExceeded - слишком много изменений;
  • rsObjectOpen - конфликт с объектом базы данных;
  • rsOutOfMemory - недостаток памяти,
  • rsPermissionDenied - нет доступа;
  • rsSchemaViolation - нарушение структуры данных;
  • rsDBDeleted - запись удалена в БД.

Как видите, благодаря этому свойству состояние отдельной записи может быть определено очень точно.
Пакетная обработка данных

   
ADO-компоненты способны работать в режиме "пакетной обработки данных", после завершения
которого все сделанные в пакете изменения либо подтверждаются, либо отвергаются.
В этом режиме все сделанные изменения не передаются немедленно источнику данных, а накапливаются в
локальном кэше. Это повышает скорость работы и позволяет сохранять сразу группу модифицированных записей.
Из отрицательных сторон этого метода стоит отметить, что пока изменения находятся на клиенте,
они недоступны другим пользователям. В данной ситуации могут возникать потери данных.

   
Для перевода набора данных в режим "пакетной обработки данных" необходимо выполнение следующих условий.
Набор данных должен использовать клиентский курсор: свойство CursorLocation должно иметь значение
clUseClient.
Курсор должен иметь тип ctStatic( свойсвоCursorType).
Блокировка должна иметь значение ltBatchOptimistic (свойствоLockType).

   
Для передачи сделанных изменений в хранилище данных в компонентах ADO используется метод UpdateBatch:

   procedure UpdateBatch(AffectRecords: TAffectRecords = arAll);

Для отмены всех сделанных, но не сохраненных методом UpdateBatch изменений применяется метод
CancelBatch:

   procedure CancelBatch(AffectRecords: TAffectRecords = arAll); 

Используемый в методах тип TAffectRecords позволяет задать тип записей, к которым применяется данная
операция:

  • arCurrent - операция выполняется только для текущей записи;
  • arFiltered - операция выполняется для записей из работающего фильтра;
  • arAll - операция выполняется для всех записей;
  • arAllChapters - операция выполняется для всех записей текущего набора данных (включая невидимые из-за включенного фильтра), а также для всех вложенных наборов данных.

Свойства Filter и Filtered

   
Фильтрацию можно осуществлять с помощью свойств Filter и Filtered.
Свойство Filter задает критерий фильтрации. В этом случае набор данных будет отфильтрован, как только
в его свойстве Filtered будет помещено значение True.
Например:

   ADOTable1.Filter:= (TeamName='ЦСКА') and (Nomer>10);
   ADOTable1.Filtered:=True;

После выполнения данного кода в компоненте ADOTable1 останутся записи об игроках команды
"ЦСКА", номер которых больше десяти.
Свойство FilterGroup

   
Помимо обычной фильтрации, основанной на свойствах Filter, Filtered, класс TCustomADODataSet
предоставляет разработчику дополнительные возможности.

   
Свойство FilterGroup задает групповой фильтр для записей, основываясь на информации о состоянии
каждой записи набора данных, подобно рассмотренному выше свойству RecordStatus.
Фильтрация возможна по следующим параметрам:

  • fgUnassigned - фильтр не указан;
  • fgPendingRecords - фильтр показывает строки, которые были изменены, но еще не обновлены
    (метод UpdateBatch) или отменены (метод CancelBatch);
  • fgNone - отключает фильтр, и все записи становятся видимыми;
  • fgAffectedRecords - фильтр показывает последние обновленные записи;
  • fgFetchedRecords - фильтр показывает записи в текущем кэше обновления. Это строки, полученные при
    последнем запросе;
  • fgPredicate - фильтр показывает удаленные записи;
  • fgConflictingRecords - фильтр показывает строки, которые были изменены, но не были обновлены из-за ошибок;

Для того чтобы групповая фильтрация заработала, необходимы два дополнительных условия.
Во-первых, фильтрация должна быть включена - свойство Filtered должно иметь значение True.
Во-вторых, свойство LockType должно иметь значение ItBatchOptimistic.
Методы SaveToFile и LoadFromFile

   
Любопытной особенностью ADO-наборов являются методы SaveToFile и LoadFromFile.
Эти методы используются в качестве одного из возможных механизмов обмена данными между разными
компьютерами, а также для отложенной обработки данных. Перед вызовами методов ADO-набор должен
быть закрыт.
После успешного вызова LoadFromFile набор автоматически открывается в том состоянии,
в котором он был сохранен методом SaveToFile.
Метод FilterOnBookmarks

   
Метод FilterOnBookmarks позволяет осуществлять сортировку ADO-наборов по закладкам.
Для этого предварительно необходимо при помощи метода GetBookmark установить закладки на
интересующих записях.
Метод Clone

   
Метод Clone позволяет дублировать уже созданный набор данных.
Например:

   ADOTable1.Open;
   ADOTable2.Clone (ADOTable1, ltReadOnly);

В результате для созданного набора данных ADOTable1 будет создан дубликат в наборе ADOTable2.
Метод Requery

   
Метод Requery позволяет обновить набор данных. Его действие фактически эквивалентно последовательному
использованию методов Close и Open. Но особенностью является то обстоятельство, что влияющие
на набор данных свойства, такие как CursorLocation, CursorType и т. п., остаются неизменными,
а при использовании методов Close и Open эти свойства могут измениться и тем самым повлиять
на результирующий набор данных.
Методы Locate и Lookup

   
С помощью методов Locate и Lookup можно осуществлять поиск записей.
Метод Locate ищет первую запись, удовлетворяющую критерию поиска, и если такая запись найдена,
делает ее текущей. В этом случае в качестве результата возвращается True. Если запись не найдена,
возвращается False и положение курсора не меняется. Например:

   procedure TForm1.Edit1Change(Sender: TObject); 
   begin 
        if ADOTable1.Locate('Fam',edit1.Text,[]) 
        then DBGrid1.SetFocus;  
   end;

При вводе в компонент Edit1 фамилии игрока программа отыщет в наборе данных первую
запись с этой фамилией.

   
Метод Lookup находит запись, удовлетворяющую условию поиска, но не делает ее текущей,
а возвращает значения некоторых ее полей.

   
На следующем шаге мы рассмотрим компонент TADODataSet.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий