Объект CDaoRecordset объединяет набор данных. Он объект может быть трех типов:
С помощью динамического набора есть возможность получить доступ ко всей таблице или к ее части. Создавая динамический набор Вы не создаете новую таблицу в базе данных. Вы создаете виртуальную таблицу в памяти компьютера. Это не ведет к увеличению базы данных, но зато расходует оперативную память. Работа с динамическим набором производится так. Сначала выбираются записи в соответствии с тем, что Вы попросили. После этого из набора формируется таблица с временными ключами и именно она передается на ваш компьютер или в Вашу программу. В зависимости от того, что Вы делаете Вам передаются физические записи. Например, перешли на последнюю запись набора и содержание этой записи полностью Вам передается. Кто все это делает ??? Microsoft Jet. За все это отвечает она и Вам нет до этого дела. От программиста требуется только понимание процесса. Ну, например, если при динамическом наборе таблица очень большая, а мне нужно будет просто просматривать записи. Хватит памяти ???? Скорее всего да, так как мы не помещаем в память всю таблицу, а только записи с которыми работаем. Влияет передвижение на трафик в сети, если база данных на сервере ??? Да, вначале при передаче ключей и потом по мере передвижений по записям.
Табличный объект дает Вам доступ непосредственно к физической таблице. Что это дает ??? Ну, например, при табличном объекте открытом у нескольких пользователей изменения будут сразу видны. Но здесь есть недостатки. Создавая объект такого типа вы не можете делать выборку, то есть создать часть таблицы, только всю и при этом нельзя объединять таблицы, сортировать. Кроме того этот тип нельзя использовать при работе с ODBC. Так как при работе с динамическим набором передаются указатели, а сами данные только в случае необходимости.
Статический объект полностью идентичен динамическому за исключением того, что все данные хранятся на рабочей станции и этот объект используется только для чтения, это моментальный снимок таблицы. Для того, чтобы увидеть изменения надо сделать новый запрос.
Тип объекта указывается при открытии набора в функции Open():
virtual void Open( int nOpenType = AFX_DAO_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, int nOptions = 0 ); throw( CDaoException, CMemoryException ); virtual void Open( CDaoTableDef* pTableDef, int nOpenType = dbOpenTable, int nOptions = 0 ); throw( CDaoException, CMemoryException ); virtual void Open( CDaoQueryDef* pQueryDef, int nOpenType = dbOpenDynaset, int nOptions = 0 ); throw( CDaoException, CMemoryException );
В переменной nOpenType указывается как будет открыта таблица с помощью констант:
Пример:
CDaoRecordset rs(&db); rs.Open(dbOpenDynaset, _T("Select [Student Name], AVG([Test Score]) AS AvgScore FROM SCORES GROUP BY [Student Name]"));