Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SUBD_OKR / Набор данных TTable, TQuery.doc
Скачиваний:
10
Добавлен:
25.02.2016
Размер:
206.85 Кб
Скачать

Набор данных

Любое приложение баз данных должно уметь выполнять как минимум две операции. Во-первых, иметь информацию о местонахождении базы данных, подключаться к ней и считывать имеющуюся в таблицах БД информацию. Приложения баз данных Delphi используют для этих целей возможности процессора БД BDE (гл. 14).

Во-вторых, обеспечивать представление и использование полученных данных. Множество записей одной или нескольких таблиц, переданные в приложение в результате выполнения запроса, будем называть набором данных. Понятно, что в объектно-ориентированной среде для представления какой-либо группы записей приложение должно использовать возможности некоторого класса. Этот класс должен инкапсулировать набор данных и обладать методами для управления записями и полями.

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

Пользователь просматривает на экране данные — это результат использования набора данных.

Пользователь решил изменить какую-то цифру — он изменит содержимое ячейки набора данных.

При закрытии приложение сохраняет все изменения — это набор данных приложения передается в базу данных для сохранения.

Поэтому не удивительно, что разработчики VCL уделили особое внимание созданию максимально эффективной иерархии классов, обеспечивающих использование наборов данных (рис. 16.1).

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

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

Класс TDBDataSet обеспечивает доступ к таблицам БД через BDE, получение и передачу данных.

Рис. 16.1. Иерархия классов, обеспечивающих функционирование набора данных

На основе этих классов реализованы специальные компоненты VCL, которые позволяют разработчику легко и просто конструировать приложения баз данных. Это компоненты TTable и TQuery.

Абстрактный набор данных

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

Этот класс задает структурную основу функционирования набора данных. Другими словами, это скелет набора данных, к методам которого необходимо лишь добавить требуемые вызовы соответствующих функций BDE.

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

Поля

Как известно, набор данных представляет собой двумерную таблицу данных. Строки соответствуют записям, столбцы — полям таблицы БД. При этом поля составляют структуру данных таблицы и играют важнейшую роль в работе набора данных.

Для представления полей в наборе данных используется очень важное свойство Fields. Именно к этому свойству обращается разработчик при необходимости прочитать или записать значение какого-либо поля. Это переменная объектного типа. Для инкапсуляции списка полей набора данных предназначен специальный класс TFieid (гл. 17).

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

Каждому полю соответствует специальный объект TFieidDef, в котором содержится описание основных параметров поля.

Редактирование данных

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

Для отдельного поля значение можно изменить, обнулить или восстановить.

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

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

Метод post может вызываться разработчиком при необходимости и вызывается автоматически при переходе к другой записи.

Навигация по набору данных

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

Перемещение на одну запись вперед и назад, переход на первую и последнюю записи являются стандартными операциями навигации по набору данных. Работа компонента TDBNavigator основана на использовании этих методов набора данных.

Состояния набора данных

В зависимости от выполняемой операции, набор данных может находиться в одном из нескольких состояний. Например, при перемещении по записям набор данных находится в состоянии просмотра. Подробно состояния обсуждаются ниже. Сейчас остановимся только на механизме определения состояния, который реализован в классе TDataSet.

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

метода post выше). А после выполнения операции, при необходимости, значение свойства State изменяется в соответствии с выполненными действиями.