Набор записей: пакетная выборка строк (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
функцию-член для передачи данных из источника данных в объект набора записей. Однако данные не передаются из набора записей обратно в источник данных. Вызов функций элементовEdit
Delete
илиUpdate
функций-членов приводит к сбоюAddNew
утверждения. ХотяCRecordset
в настоящее время не предоставляется механизм обновления массовых строк данных, вы можете написать собственные функции с помощью функцииSQLSetPos
API ODBC. Дополнительные сведения смSQLSetPos
. в справочнике программиста ODBC.Функции-члены
IsDeleted
,IsFieldDirty
,IsFieldNull
,SetFieldDirty
IsFieldNullable
иSetFieldNull
не могут использоваться в наборах записей, реализующих массовое получение строк. Однако вместо нееIsDeleted
GetODBCFieldInfo
IsFieldNullable
можно вызвать.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 );
}
Примечание.
Необходимо вызвать функцию-член, прежде чем производный Close
CRecordset
класс выходит из области. Это гарантирует, что любая память, выделенная платформой, освобождается. Рекомендуется всегда явно вызывать Close
, независимо от того, реализована ли массовая выборка строк.
Дополнительные сведения об обмене полями записей (RFX) см. в разделе "Обмен полями записей: как работает RFX". Дополнительные сведения об использовании параметров см. в разделе CFieldExchange::SetFieldType и Recordset: параметризация набора записей (ODBC).
См. также
Набор записей (ODBC)
CRecordset::m_nFields
CRecordset::m_nParams