Recordset - это источник строк. Этот обьект можно рассматривать как оболочку для строк или колонок таблицы. То есть этот обьект может включать, как всю таблицу, так и часть её на основе SQL запроса. В файле базы данных может храниться не одна таблица. Базы данных для этого и предусмотрены. Только старые версии персональных баз данных типа FoxPro хранят каждую таблицу в отдельном файле.
Итак для создания обьекта нам необходимо обьявить переменную. Обьект создается на основе конструктора. Вот описание конструктора.
CRecordset( CDatabase* pDatabase = NULL);
Как видите в конструктор можно передать указатель на объект типа CDatabase, который отвечает за доступ к базе данных. Конструктор предусматривает и простое создание без передачи обьекта CDatabase. Действительно манипулируя доступными дланными есть возможность в последствии прикрепить класс CDatebase.
Работа с классом CDatabase расматривалась в предыдущих главах. Будем cчитать, что мы создали и открыли этот обьект.
Использование конструктора.
if (cdbMyDB.IsOpen()) { CRecordset cr(&cdbMyDB); }
Или вот так например:
if (cdbMyDB.IsOpen()) { CRecordset cr; cr.m_pDatabase=&cdbMyDB; }
В плане использования два предыдущих конструктора идентичны, и в плане функциональности тоже. Переменная m_pDatabase, в которой хранится указатель на базу данных в виде указателя на класс CDatabase, общедоступная и может быть использована в любой момент. Вот её объявление:
CDatabase* m_pDatabase;
Имея созданный объект CRecordset Вы можете теперь открыть таблицу на основе SQL запроса.
cr.Open(CRecordset::forwardOnly,"SELECT * FROM TABLE1;",CRecordset::readOnly);
Подразумевается, что в Вашей базе данных присутствует таблица Table1. Вызов данной функции может вызвать исключительные ситуации следующих типов:
CDBException CMemoryException;
Расшифровка этих исключительных ситуаций позволит Вам получить информацию о произошедшей ошибке. Только не забудьте при подобных испытаниях с исключительными ситуациями переключаться на тип проекта Release, дабы не нарываться на злобный ASSERT. Смотрите пример ниже. Таблицы TABLE21 у меня нет.
CRecordset cr; cr.m_pDatabase=&cdbMyDB; try { cr.Open(CRecordset::forwardOnly,"SELECT * FROM TABLE21;", CRecordset::readOnly); cr.Close(); } catch(CDBException cdb) { AfxMessageBox(cdb.m_strStateNativeOrigin); }
Внизу показано собщение в результате работы данного кода.
Класс CRecordset имеет функцию IsOpen она вам знакома из класса CDatabase:
if (cr.IsOpen()) ......;