Московский государственный университет имени М.В.Ломоносова
Опубликован: 20.12.2005 | Доступ: свободный | Студентов: 3141 / 371 | Оценка: 4.22 / 3.86 | Длительность: 12:03:00
ISBN: 978-5-9556-0068-0
Лекция 10:

Реализация доступа к базам данных в среде VISUAL STUDIO.NET на языке С++ с применением MFC

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >

Класс CRECORDSET

Класс CRecordset реализует операции над результирующим набором, получаемым из источника данных при выполнении SQL-оператора SELECT.

Результирующий набор может использоваться в двух режимах:

  • динамический набор записей (dynasets), состояние которого синхронизируется с изменениями, сделанными другими пользователями;
  • статический набор записей (snapshots), не отражающий изменения, производимые другими пользователями.

Класс CRecordset позволяет:

  • просматривать записи результирующего набора;
  • изменять записи;
  • выполнять блокировку записей;
  • сортировать записи;
  • определять фильтр для выбора записей.

Для использования набора записей из базы данных следует:

  1. Создать объект класса CRecordset, передав конструктору в качестве параметра указатель на объект CDatabase или NULL ;
  2. Вызвать метод Open и определить режим использования набора данных: динамический или статический.

Метод Open создает (открывает) результирующий набор.

Член класса CRecordset::m_hstmt содержит указатель на структуру данных типа HSTMT (дескриптор оператора).

Класс CRecordset содержит переменные и методы для работы с результирующим набором, включая следующие:

  • CRecordset::m_nFields – переменная, содержащая количество полей в результирующем наборе.
  • CRecordset::m_nParams – переменная, содержащая количество параметров, используемых в запросе.
  • CRecordset::m_pDatabase – переменная, содержащая указатель на объект CDatabase посредством которого для данного результирующего набора было установлено соединение с базой данных.
  • CRecordset::m_strFilter – переменная, содержащая условие, указываемое во фразе WHERE SQL-оператора (условие должно быть определено до создания результирующего набора вызовом метода Open ).

    Например:

    CMySet rsMySet( NULL );  // Класс CMySet наследуется от CRecordset
    // Определение фильтра (условия во фразе WHERE)
       rsMySet.m_strFilter = "field2 > 123";
    // Выполнение запроса – открытие результирующего набора
       rsMySet.Open( CRecordset::snapshot, "MyTbl1" );
  • CRecordset::m_strSort – переменная, содержащая значение, указываемое во фразе ORDER BY SQL-оператора;
  • CRecordset ( CDatabase* pDatabase = NULL); – конструктор;
  • Open – метод, создающий результирующий набор;
  • CanAppend – метод, определяющий, разрешено ли в данный открытый набор записей добавлять новые записи;
  • GetSQL – метод, возвращающий SQL-оператор, использованный для получения открытого в данный момент результирующего набора;
  • IsEOF – метод, определяющий, достигнут ли конец результирующего набора;
  • IsBOF – метод, определяющий, достигнуто ли начало набора записей.

    Например:

    rsSet.Open( ); // Результирующий набор открыт: 
                   // текущая запись - первая
    if( rsSet.IsBOF( ) )    return;    	// Результирующий набор пуст
    while ( !rsSet.IsEOF( ) )		// Просмотр всех 
                                      // записей от начала до конца
        rsSet.MoveNext( );
    rsSet.MoveLast( );		      // Переход к последней записи
    while( !rsSet.IsBOF( ) )	      // Просмотр всех 
     			         // записей от конца до начала
        rsSet.MovePrev( );
    rsSet.MoveFirst( );	            // Переход к первой записи
  • AddNew – метод, используемый для добавления новой записи (только для режима выборки по одной записи);
  • CancelUpdate – метод, используемый для отмены изменений, произведенных операциями Edit или AddNew с момента последнего вызова метода Update ;
  • Delete – метод, используемый для удаления текущей записи;
  • Edit – метод, вызываемый для включения режима редактирования текущей записи. В режиме редактирования можно выполнять методы AddNew и Delete. Для внесения изменений, сделанных этими методами, в базу данных следует вызвать метод Update.

    Например:

    rsSet.Edit( );		// Начало операций изменения записи
    rsSet.m_dwF1 = 123;
    rsSet.m_strF1 = "abc";
    if( !rsCustSet.Update( ) )    // Внесение изменений
  • Update – метод, возвращающий ненулевое значение в том случае, если запись источника данных была успешно обновлена;
  • MoveFirst – метод, перемещающий указатель текущей записи на первую запись результирующего набора;
  • MoveLast – метод, перемещающий указатель текущей записи на последнюю запись результирующего набора;
  • MoveNext – метод, перемещающий указатель текущей записи на следующую запись результирующего набора;
  • MovePrev – метод, перемещающий указатель текущей записи на предыдущую запись результирующего набора;
  • DoFieldExchange – метод, вызываемый для автоматического обмена данными между членами класса – полями результирующего набора (текущей записи) и соответствующими полями текущей записи в источнике данных. Метод DoFieldExchange доступен только для объектов класса, производного от класса CRecordset. Если набор записей создан непосредственно как объект класса CRecordset, то следует использовать метод GetFieldValue. Обмен данными с источником данных, называемый RFX-обменом (record field exchange), работает в двух направлениях: из полей объекта "результирующий набор" в поля источника данных и обратно. Для того чтобы использовать этот метод, достаточно в производном классе результирующего набора определить имена и тип полей данных – членов класса. ClassWizard самостоятельно вставит код в переопределяемый метод DoFieldExchange.

Например:

void CSet::DoFieldExchange(CFieldExchange* pFX)
{
   pFX->SetFieldType(CFieldExchange::outputColumn);
   RFX_Int(pFX, "F1", m_wF1);   // Вызов RFX-метода
   RFX_Text(pFX, "F2", m_strF2);
}
< Лекция 9 || Лекция 10: 12345 || Лекция 11 >