Основы проектирования приложений баз данных

       

Класс 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); }


Содержание раздела