Шаг 9.
Технология ADO.
Класс TCustomADODataSet

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

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

    Как и положено для компонентов, инкапсулирующих набор данных, их общим предком является класс 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. Возможные значения:

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

Пакетная обработка данных

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

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

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

   procedure UpdateBatch(AffectRecords: TAffectRecords = arAll);
Для отмены всех сделанных, но не сохраненных методом UpdateBatch изменений применяется метод CancelBatch:
   procedure CancelBatch(AffectRecords: TAffectRecords = arAll); 
Используемый в методах тип TAffectRecords позволяет задать тип записей, к которым применяется данная операция:

Свойства Filter и Filtered

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

   ADOTable1.Filter:= (TeamName='ЦСКА') and (Nomer>10);
   ADOTable1.Filtered:=True;
После выполнения данного кода в компоненте ADOTable1 останутся записи об игроках команды "ЦСКА", номер которых больше десяти.

Свойство FilterGroup

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

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

Для того чтобы групповая фильтрация заработала, необходимы два дополнительных условия. Во-первых, фильтрация должна быть включена - свойство 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.




Предыдущий шаг Содержание Следующий шаг