Шаг 130.
Среда программирования Visual C++.
Классы CRecordset и CDaoRecordset

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

    Эти объекты инкапсулируют набор записей, выбранных из базы данных. Он похож на документ в архитектуре "документ/вид", в том смысле что он содержит данные, отображаемые объектом представления записей.

    Наборы позволяют просматривать записи по отдельности, изменять их (добавлять, редактировать и удалять), задавать фильтры, сортировать, а также заполнять их информацией времени выполнения. Переменные-члены объекта набора записей соответствуют выбранным из БД столбцам и заполняются данными конкретных строк по мере просмотра набора записей пользователем.

    Обмен данными между переменными-членами объекта и соответствующими столбцами таблицы в источнике осуществляется при помощи механизма обмена полями записи (Record Field Exchange, RFX). Он напоминает механизм DDX, используемый для обмена данными между элементами управления диалогового окна и классами диалога.


    Примечание. Обратите внимание: в DAO RFX носит имя DFX - сокращение от DAO Record Field Exchange (обмен полями записи в DAO).

    При создании объект набора записей связывается с объектом базы данных, адрес которого передается конструктору. Это проиллюстрировано в следующем примере для ODBC-класса:

  CDatabase db;
  db.OpenEx("DSN=pubs;UID=sa;PWD=password",0);
  CRecordset rs(&db);

    Создавая производный от CRecordset или CDaoRecordset класс допустимо перегрузить функции-члены и задать сведения о подключении, а при создании объекга этого класса передавать в конструктор NULL. Если Вы выберете такой способ, то на основе этих сведений MFC создаст временный объект базы данных, связанный с Вашим набором записей.

    В созданном таким образом объекте вызов функции-члена Ореn() обеспечивает выполнение запроса и помещение полученных записей в набор. Ниже показано, как вызвать эту функцию для объекта набора записей из предыдущего примера:

  rs.Open(CRecordset::dynaset,   "SELECT * FROM authors", CRecordset::none);

    Первый параметр функции CRecordset::Open() указывает на тип курсора, создаваемого для выбранных данных (таблица 1).

Таблица 1. Типы курсора в функции-члене CRecordset::Open()
Параметр Назначение
CRecordset::dynaset Создает динамический набор записей, который можно прокручивать вперед и назад. Порядок сортировки данных фиксируется при его создании. Динамические наборы вполне пригодны для большинства операций с базами данных, так как они экономят память, храня только ключи полученной выборки, а также отображают большинство изменений, внесенных другими пользователями (кроме вставки записей)
CRecordset:snapshot Снимок - набор записей, не отображаюший изменений в источнике данных, сделанных другими пользователями, но который можно прокручивать в обе стороны. Такие наборы полезны, когда нужна гарантия неизменности набора в процессе работы с ним, например при генерации отчетов
CRecordset::dynamic Создает полностью динамический набор записей. Его можно прокручивать в обоих направлениях, а все исправления, сделанные пользователями, моментально отображаются в нем. Такой динамический курсор наиболее ресурсоемок, его применяют, когда набор должен постоянно отражать состояние источника данных в настоящий момент
CRecordset::forwardonly Создает набор записей только для чтения с прокруткой только в одном направлении. Такой курсор наиболее быстр и требует минимума ресурсов. Часто бывает достаточно однократного последовательного просмотра выборки, и именно для таких случаев предназначен этот курсор

    Второй параметр функции Ореn() - строка SQL-команд, а последний - битовая маска, позволяющая задать режим созданного набора записей: только для добавления, только для чтения, допустима ли обработка нескольких строк и т.д. Значение CRecordset::none указывает, что ни один из этих режимов не устанавливается. Полный список режимов Вы получите, проведя в справочной системе Visual C++ поиск по ключевому слову "CRecordset::Open".

    CDaoRecordset::Open() похожа на CRecordset::Open(). Класс CDaoRecordset позволяет создавать только наборы типа dynaset, snapshot или table. Последний тип представляет собой обновляемый набор записей из одной таблицы базы данных. Наборы типа snapshot в классе CDaoRecordset предназначены только для чтения.

    Закончив работать с набором записей, закройте его вызовом функции-члена Close(). Это надо сделать до закрытия связанного с ним объекта базы данных.

    На следующем шаге мы рассмотрим классы CRecordView и CDaoRecordView.




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