Московский государственный университет имени М.В.Ломоносова
Опубликован: 20.12.2005 | Доступ: свободный | Студентов: 3142 / 371 | Оценка: 4.22 / 3.86 | Длительность: 12:03:00
ISBN: 978-5-9556-0068-0
Лекция 12:

Реализация доступа к базам данных в среде DELPHI

Наборы данных

Предком всех классов наборов данных является класс TDataSet. Он определяет основу структуры всех наборов данных - массив компонентов типа TField (каждый элемент массива соответствует столбцу таблицы).

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

В зависимости от механизма доступа, используемого приложением, базовыми классами набора данных могут быть:

  • TTable, TQuery, TStoredProc - для однозвенных или двухзвенных приложений, использующих машину баз данных BDE. Класс TQuery дополнительно позволяет выполнять параметрические запросы;
  • TClientDataSet - для реализации клиентского набора данных и для многозвенной архитектуры, использующей распределенный доступ;
  • TADODataSet - для приложений, использующих ADO-объекты;
  • TSQLDataSet - для доступа к базе данных посредством dbExpress. Этот класс реализует направленный набор данных, функционирующий по принципу курсора. Для такого набора данных не создается кэш памяти на клиенте, и среди методов доступа возможны только методы Next и First. Редактирование записей в направленном наборе данных возможно только явным выполнением SQL-оператора UPDATE или при установке соединения с клиентским набором данных через провайдера;
  • TSQLTable и TSQLQuery - для доступа к базе данных посредством dbExpress.

На следующей схеме приведена иерархия классов наборов данных библиотеки VCL:


Для определения набора данных необходимо задать следующие свойства:

  • для класса TTable - значения свойств DatabaseName и TableName ;
  • для класса TQuery - значение свойства SQL и, возможно, свойства DatabaseName.

Для того чтобы читать данные из таблиц или записывать их в таблицы, набор данных предварительно должен быть открыт.

Открыть набор данных можно одним из следующих способов:

  • установить значение свойства Active набора данных равным True во время выполнения приложения (например, Table1.Active:= True; ) или в режиме проектирования в инспекторе объектов;
  • вызвать метод Open (например, Table1.Open; ).

Аналогично, закрыть набор данных можно вызовом метода Close или установив значение свойства Active равным False. Для компонента типа TQuery метод Open может быть выполнен только для закрытого набора данных: попытка открыть уже открытый набор данных инициирует ошибку.

Открытие набора данных влечет за собой:

  • инициацию событий BeforeOpen и AfterOpen ;
  • установку состояния набора данных в dsBrowse;
  • открытие курсора для набора данных.

Если в момент открытия набора данных произошла ошибка, то состояние набора данных устанавливается в dsInactive, а курсор закрывается.

При работе с компонентами наборов данных можно обойтись без явного использования компонентов, реализующих соединение с базой данных. Однако некоторые возможности, такие как управление транзакциями или кэшированные обновления, невозможны без компонентов типа TDatabase или TADOConnection. Компонент "база данных" TDatabase применяется для соединения с источником данных через драйверы BDE или внешние ODBC-драйверы. Компонент TADOConnection используется для создания объекта "соединение" при доступе через OLE DB, который инкапсулируется посредством ADO-объектов VCL-библиотеки.

По умолчанию при переходе от одной записи набора данных к другой происходит запись всех сделанных изменений в базу данных. Для того чтобы можно было отменять сделанные изменения или выполнять обновление нескольких записей, применяют кэшированные обновления. Они позволяют значительно снизить сетевой трафик за счет того, что все сделанные изменения хранятся во внутреннем кэше и при переходе от одной записи к другой информация в базу данных не передается. Чтобы включить режим кэшированного обновления, следует установить значение свойства CachedUpdates равным True для компонента набора данных. Для присвоения кэшированного обновления вызывается метод ApplyUpdates, а для отмены - CancelUpdates.