Шаг 4 - CRecordset

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);
}

Внизу показано собщение в результате работы данного кода.

4_1.gif (4354 b)

Класс CRecordset имеет функцию IsOpen она вам знакома из класса CDatabase:

if (cr.IsOpen()) ......;

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 14.10.99