Набор записей: пакетная выборка строк (ODBC)

Этот раздел относится к классам ODBC библиотеки MFC.

Класс CRecordset обеспечивает поддержку массового получения строк, что означает, что несколько записей можно получить одновременно во время одной выборки, а не извлекать одну запись за раз из источника данных. Вы можете реализовать массовое получение строк только в производном CRecordset классе. Процесс передачи данных из источника данных в объект набора записей называется массовым обменом полями записей (Bulk RFX). Обратите внимание, что если вы не используете массовое получение строк в CRecordsetпроизводном классе, данные передаются через обмен полями записей (RFX). Дополнительные сведения см. в разделе "Обмен полями записей" (RFX).

В этом разделе рассматриваются следующие вопросы.

Как CRecordset поддерживает получение массовых строк

Перед открытием объекта набора записей можно определить размер набора строк с SetRowsetSize помощью функции-члена. Размер набора строк указывает, сколько записей следует извлекать во время одного получения. При реализации массового получения строк размер набора строк по умолчанию равен 25. Если массовое получение строк не реализовано, размер набора строк остается фиксированным в 1.

После инициализации размера набора строк вызовите функцию Open member. Здесь необходимо указать CRecordset::useMultiRowFetch параметр dwOptions для реализации массового получения строк. Можно также задать CRecordset::userAllocMultiRowBuffers этот параметр. Механизм обмена полями массовой записи использует массивы для хранения нескольких строк данных, полученных во время получения. Эти буферы хранилища можно выделить автоматически платформой или выделить их вручную. Указание CRecordset::userAllocMultiRowBuffers параметра означает, что вы будете выполнять выделение.

В следующей таблице перечислены функции-члены, предоставляемые CRecordset для поддержки массового получения строк.

Функция-член Description
CheckRowsetError Виртуальная функция, которая обрабатывает все ошибки, возникающие во время получения.
DoBulkFieldExchange Реализует обмен полями массовой записи. Вызывается автоматически для передачи нескольких строк данных из источника данных в объект набора записей.
GetRowsetSize Извлекает текущий параметр для размера набора строк.
GetRowsFetched Указывает, сколько строк было фактически извлечено после заданного получения. В большинстве случаев это размер набора строк, если не был выполнен неполный набор строк.
GetRowStatus Возвращает состояние получения для определенной строки в наборе строк.
ОбновитьRowset Обновляет данные и состояние определенной строки в наборе строк.
SetRowsetCursorPosition Перемещает курсор в определенную строку в наборе строк.
SetRowsetSize Виртуальная функция, которая изменяет параметр для размера набора строк на указанное значение.

Особые соображения

Хотя массовое получение строк является повышением производительности, некоторые функции работают по-разному. Прежде чем решить реализовать массовое получение строк, рассмотрите следующее:

  • Платформа автоматически вызывает DoBulkFieldExchange функцию-член для передачи данных из источника данных в объект набора записей. Однако данные не передаются из набора записей обратно в источник данных. Вызов функций элементов EditDeleteили Update функций-членов приводит к сбою AddNewутверждения. Хотя CRecordset в настоящее время не предоставляется механизм обновления массовых строк данных, вы можете написать собственные функции с помощью функции SQLSetPosAPI ODBC. Дополнительные сведения смSQLSetPos. в справочнике программиста ODBC.

  • Функции-члены IsDeleted, IsFieldDirty, IsFieldNull, SetFieldDirtyIsFieldNullableи SetFieldNull не могут использоваться в наборах записей, реализующих массовое получение строк. Однако вместо нее IsDeletedGetODBCFieldInfoIsFieldNullableможно вызвать.GetRowStatus

  • Операции Move перенастрояют набор записей по набору строк. Например, предположим, что вы открываете набор записей с 100 записями с начальным размером набора строк размером 10. Open Извлекает строки 1–10 с текущей записью, размещенной на строке 1. Вызов для MoveNext получения следующего набора строк, а не следующей строки. Этот набор строк состоит из строк 11–20 с текущей записью, размещенной на строке 11. Обратите внимание, что MoveNext и Move( 1 ) не эквивалентны при реализации массового получения строк. Move( 1 ) Извлекает набор строк, начинающийся с 1 строки из текущей записи. В этом примере вызов после вызова Move( 1 )Open извлекает набор строк, состоящий из строк 2–11, с текущей записью, размещенной на строке 2. Дополнительные сведения см. в функции элемента Move .

  • В отличие от обмена полями записей, мастеры не поддерживают обмен полями массовой записи. Это означает, что необходимо вручную объявить члены данных поля и вручную переопределить DoBulkFieldExchange путем записи вызовов функций Bulk RFX. Дополнительные сведения см. в разделе "Функции Exchange поля записи" в справочнике по библиотеке классов.

Реализация exchange полей массовой записи

Обмен полем массовой записи передает набор данных из источника данных в объект набора записей. Функции BULK RFX используют массивы для хранения этих данных, а также массивы для хранения длины каждого элемента данных в наборе строк. В определении класса необходимо определить элементы данных поля в качестве указателей для доступа к массивам данных. Кроме того, необходимо определить набор указателей для доступа к массивам длин. Любые члены данных параметров не должны объявляться в качестве указателей; Объявление элементов данных параметров при использовании обмена полями массовой записи совпадает с объявлением их при использовании обмена полями записей. В следующем примере кода показан простой пример:

class MultiRowSet : public CRecordset
{
public:
   // Field/Param Data
      // field data members
      long* m_rgID;
      LPSTR m_rgName;

      // pointers for the lengths
      // of the field data
      long* m_rgIDLengths;
      long* m_rgNameLengths;

      // input parameter data member
      CString m_strNameParam;

   .
   .
   .
}

Эти буферы хранилища можно выделить вручную или использовать платформу для выделения. Чтобы выделить буферы самостоятельно, необходимо указать CRecordset::userAllocMultiRowBuffers параметр dwOptions в функции-члене Open . Не забудьте задать размеры массивов по крайней мере равным размеру набора строк. Если вы хотите использовать платформу для выделения, следует инициализировать указатели на NULL. Обычно это делается в конструкторе объекта набора записей:

MultiRowSet::MultiRowSet( CDatabase* pDB )
   : CRecordset( pDB )
{
   m_rgID = NULL;
   m_rgName = NULL;
   m_rgIDLengths = NULL;
   m_rgNameLengths = NULL;
   m_strNameParam = "";

   m_nFields = 2;
   m_nParams = 1;

   .
   .
   .
}

Наконец, необходимо переопределить функцию-член DoBulkFieldExchange . Для элементов данных поля вызовите функции BULK RFX; для всех элементов данных параметров вызовите функции RFX. При открытии набора записей путем передачи инструкции SQL или хранимой процедуры в порядок Openвызовов Bulk RFX должен соответствовать порядку столбцов в наборе записей. Аналогичным образом порядок вызовов RFX для параметров должен соответствовать порядку параметров в инструкции SQL или хранимой процедуре.

void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
{
   // call the Bulk RFX functions
   // for field data members
   pFX->SetFieldType( CFieldExchange::outputColumn );
   RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
                  &m_rgID, &m_rgIDLengths );
   RFX_Text_Bulk( pFX, _T( "[colName]" ),
                  &m_rgName, &m_rgNameLengths, 30 );

   // call the RFX functions for
   // for parameter data members
   pFX->SetFieldType( CFieldExchange::inputParam );
   RFX_Text( pFX, "NameParam", m_strNameParam );
}

Примечание.

Необходимо вызвать функцию-член, прежде чем производный CloseCRecordset класс выходит из область. Это гарантирует, что любая память, выделенная платформой, освобождается. Рекомендуется всегда явно вызывать Close, независимо от того, реализована ли массовая выборка строк.

Дополнительные сведения об обмене полями записей (RFX) см. в разделе "Обмен полями записей: как работает RFX". Дополнительные сведения об использовании параметров см. в разделе CFieldExchange::SetFieldType и Recordset: параметризация набора записей (ODBC).

См. также

Набор записей (ODBC)
CRecordset::m_nFields
CRecordset::m_nParams