На этом шаге мы рассмотрим классы CRecordset и CDaoRecordset.
Эти объекты инкапсулируют набор записей, выбранных из базы данных. Он похож на документ в архитектуре "документ/вид", в том смысле что он содержит данные, отображаемые объектом представления записей.
Наборы позволяют просматривать записи по отдельности, изменять их (добавлять, редактировать и удалять), задавать фильтры, сортировать, а также заполнять их информацией времени выполнения. Переменные-члены объекта набора записей соответствуют выбранным из БД столбцам и заполняются данными конкретных строк по мере просмотра набора записей пользователем.
Обмен данными между переменными-членами объекта и соответствующими столбцами таблицы в источнике осуществляется при помощи механизма обмена полями записи (Record Field Exchange, RFX). Он напоминает механизм DDX, используемый для обмена данными между элементами управления диалогового окна и классами диалога.
При создании объект набора записей связывается с объектом базы данных, адрес которого передается конструктору. Это проиллюстрировано в следующем примере для 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).
Параметр | Назначение |
---|---|
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.