Класс CRecordset

Представляет набор записей, выбранных из источника данных.

Синтаксис

class CRecordset : public CObject

Участники

Открытые конструкторы

Имя Описание
CRecordset::CRecordset Формирует объект CRecordset. Производный класс должен предоставить конструктор, вызывающий этот класс.

Открытые методы

Имя Описание
CRecordset::AddNew Готовится к добавлению новой записи. Вызов Update для завершения добавления.
CRecordset::CanAppend Возвращает ненулевое значение, если новые записи можно добавить в набор записей через функцию-член AddNew .
CRecordset::CanBookmark Возвращает ненулевое значение, если набор записей поддерживает закладки.
CRecordset::Cancel Отменяет асинхронную операцию или процесс из второго потока.
CRecordset::CancelUpdate Отменяет все ожидающие обновления из-за AddNew или Edit операции.
CRecordset::CanRestart Возвращает ненулевое значение, если Requery его можно вызвать для повторного выполнения запроса набора записей.
CRecordset::CanScroll Возвращает ненулевое значение, если можно прокрутить записи.
CRecordset::CanTransact Возвращает ненулевое значение, если источник данных поддерживает транзакции.
CRecordset::CanUpdate Возвращает ненулевое значение, если набор записей можно обновить (можно добавлять, обновлять или удалять записи).
CRecordset::CheckRowsetError Вызывается для обработки ошибок, создаваемых во время получения записей.
CRecordset::Close Закрывает набор записей и связанный с ним ODBC HSTMT .
CRecordset::Delete Удаляет текущую запись из набора записей. После удаления необходимо явно прокрутить другую запись.
CRecordset::DoBulkFieldExchange Вызывается для обмена массовыми строками данных из источника данных в набор записей. Реализует обмен полями массовой записи (BULK RFX).
CRecordset::DoFieldExchange Вызывается для обмена данными (в обоих направлениях) между элементами данных поля набора записей и соответствующей записью в источнике данных. Реализует обмен полями записей (RFX).
CRecordset::Edit Готовится к изменениям текущей записи. Вызов Update для завершения редактирования.
CRecordset::FlushResultSet Возвращает ненулевое значение, если требуется получить другой результирующий набор при использовании предопределенного запроса.
CRecordset::GetBookmark Назначает значение закладки записи объекту параметра.
CRecordset::GetDefaultConnect Вызывается для получения строка подключения по умолчанию.
CRecordset::GetDefaultSQL Вызывается для получения строки SQL по умолчанию для выполнения.
CRecordset::GetFieldValue Возвращает значение поля в наборе записей.
CRecordset::GetODBCFieldCount Возвращает количество полей в наборе записей.
CRecordset::GetODBCFieldInfo Возвращает определенные типы сведений о полях в наборе записей.
CRecordset::GetRecordCount Возвращает количество записей в наборе записей.
CRecordset::GetRowsetSize Возвращает количество записей, которые требуется получить во время одного получения.
CRecordset::GetRowsFetched Возвращает фактическое количество строк, полученных во время получения.
CRecordset::GetRowStatus Возвращает состояние строки после получения.
CRecordset::GetSQL Возвращает строку SQL, используемую для выбора записей для набора записей.
CRecordset::GetStatus Получает состояние набора записей: индекс текущей записи и получение окончательного количества записей.
CRecordset::GetTableName Возвращает имя таблицы, на которой основан набор записей.
CRecordset::IsBOF Возвращает ненулевое значение, если набор записей был размещен до первой записи. Текущая запись отсутствует.
CRecordset::IsDeleted Возвращает ненулевое значение, если набор записей размещается в удаленной записи.
CRecordset::IsEOF Возвращает ненулевое значение, если набор записей был размещен после последней записи. Текущая запись отсутствует.
CRecordset::IsFieldDirty Возвращает ненулевое значение, если указанное поле в текущей записи было изменено.
CRecordset::IsFieldNull Возвращает ненулевое значение, если указанное поле в текущей записи равно NULL (не имеет значения).
CRecordset::IsFieldNullable Возвращает ненулевое значение, если указанное поле в текущей записи может иметь значение NULL (без значения).
CRecordset::IsOpen Возвращает ненулевое значение, если Open он был вызван ранее.
CRecordset::Move Помещает набор записей в указанное число записей из текущей записи в любом направлении.
CRecordset::MoveFirst Помещает текущую запись в первую запись в наборе записей. IsBOF Сначала протестируйте.
CRecordset::MoveLast Позиционирует текущую запись в последней записи или в последнем наборе строк. IsEOF Сначала протестируйте.
CRecordset::MoveNext Позиционирует текущую запись в следующей записи или в следующем наборе строк. IsEOF Сначала протестируйте.
CRecordset::MovePrev Позиционирует текущую запись в предыдущей записи или в предыдущем наборе строк. IsBOF Сначала протестируйте.
CRecordset::OnSetOptions Вызывается для задания параметров (используемых при выборе) для указанной инструкции ODBC.
CRecordset::OnSetUpdateOptions Вызывается для задания параметров (используемых при обновлении) для указанной инструкции ODBC.
CRecordset::Open Открывает набор записей, извлекая таблицу или выполняя запрос, который представляет набор записей.
CRecordset::RefreshRowset Обновляет данные и состояние указанных строк.
CRecordset::Requery Снова запускает запрос набора записей, чтобы обновить выбранные записи.
CRecordset::SetAbsolutePosition Помещает набор записей в запись, соответствующую указанному номеру записи.
CRecordset::SetBookmark Помещает набор записей в запись, указанную закладкой.
CRecordset::SetFieldDirty Помечает указанное поле в текущей записи как изменено.
CRecordset::SetFieldNull Задает значение указанного поля в текущей записи значение NULL (без значения).
CRecordset::SetLockingMode Задает режим блокировки на "оптимистичный" блокировку (по умолчанию) или "пессимистичную" блокировку. Определяет, как записи заблокированы для обновлений.
CRecordset::SetParamNull Задает для указанного параметра значение NULL (без значения).
CRecordset::SetRowsetCursorPosition Помещает курсор в указанную строку в наборе строк.
CRecordset::SetRowsetSize Указывает количество записей, которые требуется получить во время получения.
CRecordset::Update Выполняет AddNew или Edit выполняет операцию, сохраняя новые или измененные данные в источнике данных.

Общедоступные члены данных

Имя Описание
CRecordset::m_hstmt Содержит дескриптор инструкции ODBC для набора записей. Введите HSTMT.
CRecordset::m_nFields Содержит количество элементов данных поля в наборе записей. Введите UINT.
CRecordset::m_nParams Содержит количество элементов данных параметров в наборе записей. Введите UINT.
CRecordset::m_pDatabase Содержит указатель на CDatabase объект, через который набор записей подключен к источнику данных.
CRecordset::m_strFilter Содержит предложение CString язык SQL (SQL). WHERE Используется в качестве фильтра для выбора только тех записей, которые соответствуют определенным критериям.
CRecordset::m_strSort Содержит предложение CString SQL ORDER BY . Используется для управления сортировкой записей.

Замечания

Известные как "наборы записей" CRecordset , объекты обычно используются в двух формах: dynasets и моментальных снимков. Dynaset остается синхронизированным с обновлениями данных, сделанными другими пользователями. Моментальный снимок — это статическое представление данных. Каждая форма представляет набор записей, исправленных во время открытия набора записей. При прокрутке до записи в dynaset он отражает изменения, внесенные в запись другими пользователями или другими наборами записей в приложении.

Примечание.

Если вы работаете с классами объектов доступа к данным (DAO), а не с классами Open Database Подключение ivity (ODBC), используйте вместо этого классCDaoRecordset. Дополнительные сведения см. в разделе "Обзор: программирование баз данных".

Для работы с набором записей любого типа обычно наследуется класс набора записей для конкретного приложения.CRecordset Наборы записей выбирают записи из источника данных, а затем:

  • Прокрутите записи.

  • Обновите записи и укажите режим блокировки.

  • Отфильтруйте набор записей, чтобы ограничить, какие записи выбираются из доступных в источнике данных.

  • Сортировка набора записей.

  • Параметризируйте набор записей, чтобы настроить его выбор с информацией, неизвестной до времени выполнения.

Чтобы использовать класс, откройте базу данных и создайте объект набора записей, передавая конструктор указатель на CDatabase объект. Затем вызовите функцию-член набора Open записей, где можно указать, является ли объект dynaset или моментальным снимком. Вызов Open выбирает данные из источника данных. После открытия объекта набора записей используйте его функции-члены и члены данных, чтобы прокручивать записи и работать с ними. Доступные операции зависят от того, является ли объект набором данных или моментальным снимком, независимо от того, является ли он обновляемым или доступным только для чтения (это зависит от возможности источника данных Open Database Подключение ivity (ODBC) и реализации массового получения строк. Чтобы обновить записи, которые могли быть изменены или добавлены с момента Open вызова, вызовите функцию-член объекта Requery . Вызовите функцию-член объекта Close и уничтожите объект после завершения работы с ним.

В производном CRecordset классе обмен полями записей (RFX) или обмен полями массовой записи (Bulk RFX) используется для поддержки чтения и обновления полей записи.

Дополнительные сведения о наборах записей и обмене полями записей см. в статьях :Программирование баз данных, набор записей (ODBC), набор записей: получение записей в массовой части (ODBC) и Exchange полей записей (RFX). Сведения о dynasets и моментальных снимках см. в статьях Dynaset и Snapshot.

Иерархия наследования

CObject

CRecordset

Requirements

Заголовок.afxdb.h

CRecordset::AddNew

Готовится к добавлению новой записи в таблицу.

virtual void AddNew();

Замечания

Чтобы увидеть только что добавленную запись, необходимо вызвать функцию-член Requery . Поля записи изначально имеют значение NULL. (В терминологии базы данных null означает "отсутствие значения" и не совпадает со значением NULL в C++.) Чтобы завершить операцию, необходимо вызвать Update функцию-член. Update сохраняет изменения в источнике данных.

Примечание.

Если вы реализовали массовое получение строк, вы не можете вызвать AddNew. Это приведет к сбою утверждения. Хотя класс CRecordset не предоставляет механизм обновления массовых строк данных, вы можете написать собственные функции с помощью функции SQLSetPosAPI ODBC. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

AddNew подготавливает новую пустую запись с помощью элементов данных поля набора записей. После вызова AddNewзадайте значения, которые нужно задать в элементах данных поля набора записей. (Вам не нужно вызывать Изменение функции-члена для этой цели; используется Edit только для существующих записей.) При вызове Updateизмененные значения в элементах данных поля сохраняются в источнике данных.

Внимание

Если вы прокрутите новую запись перед вызовом Update, новая запись будет потеряна, и предупреждение не отображается.

Если источник данных поддерживает транзакции, вы можете выполнить AddNew вызов в рамках транзакции. Дополнительные сведения о транзакциях см. в классе CDatabase. Вызов CDatabase::BeginTrans перед вызовом AddNew.

Примечание.

Для dynaset новые записи добавляются в набор записей в качестве последней записи. Добавленные записи не добавляются в моментальные снимки; Необходимо вызвать Requery обновление набора записей.

Это недопустимо для вызова AddNew набора записей, чья Open функция-член не была вызвана. Возникает CDBException при вызове AddNew набора записей, к которому нельзя добавить. Можно определить, является ли набор записей обновляемым путем вызова CanAppend.

Дополнительные сведения см. в следующих статьях: Recordset: How Recordsets Update Records (ODBC), Recordset: Добавление, обновление и удаление записей (ODBC) и Транзакция (ODBC).

Пример

см. транзакцию : выполнение транзакции в наборе записей (ODBC).

CRecordset::CanAppend

Определяет, позволяет ли ранее открытый набор записей добавлять новые записи.

BOOL CanAppend() const;

Возвращаемое значение

Ненулевое значение, если набор записей позволяет добавлять новые записи; в противном случае — 0. CanAppend возвращает значение 0, если вы открыли набор записей только для чтения.

CRecordset::CanBookmark

Определяет, позволяет ли набор записей помечать записи с помощью закладок.

BOOL CanBookmark() const;

Возвращаемое значение

Ненулевое значение, если набор записей поддерживает закладки; в противном случае — 0.

Замечания

Эта функция не зависит от CRecordset::useBookmarks параметра dwOptionsOpen функции-члена. CanBookmark указывает, поддерживает ли указанный драйвер ODBC и тип курсора закладки. CRecordset::useBookmarks указывает, будут ли доступны закладки, если они поддерживаются.

Примечание.

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

Дополнительные сведения о навигации по закладкам и наборам записей см. в статьях Recordset: Bookmarks and Absolute Positions (ODBC) и Recordset: Scrolling (ODBC).

CRecordset::Cancel

Запросы, что источник данных отменяет асинхронную операцию или процесс из второго потока.

void Cancel();

Замечания

Классы ODBC MFC больше не используют асинхронную обработку; для выполнения асинхронной операции необходимо напрямую вызвать функцию SQLSetConnectOptionAPI ODBC. Дополнительные сведения см. в разделе "Асинхронное выполнение функций" в руководстве программиста пакета SDK ODBC.

CRecordset::CancelUpdate

Отменяет все ожидающие обновления, вызванные или AddNew операцией, перед Update вызовомEdit.

void CancelUpdate();

Замечания

Примечание.

Эта функция-член не применима к наборам записей, использующим массовое получение строк, так как такие наборы записей не могут вызывать EditAddNewилиUpdate. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Если автоматическое грязное поле проверка включено, CancelUpdate восстановит переменные-члены в значениях, которые они раньше Edit или AddNew вызвали; в противном случае все изменения значений останутся. По умолчанию автоматическое проверка поле включено при открытии набора записей. Чтобы отключить его, необходимо указать CRecordset::noDirtyFieldCheck параметр dwOptionsфункции Open Member.

Дополнительные сведения об обновлении данных см. в разделе Recordset: Добавление, обновление и удаление записей (ODBC).

CRecordset::CanRestart

Определяет, позволяет ли набор записей перезапустить запрос (обновить свои записи), вызвав Requery функцию-член.

BOOL CanRestart() const;

Возвращаемое значение

Ненулевое значение, если повторное запрос разрешено; в противном случае — 0.

CRecordset::CanScroll

Определяет, разрешает ли набор записей прокрутку.

BOOL CanScroll() const;

Возвращаемое значение

Ненулевое значение, если набор записей разрешает прокрутку; в противном случае — 0.

Замечания

Дополнительные сведения о прокрутке см. в разделе Recordset: Scrolling (ODBC).

CRecordset::CanTransact

Определяет, разрешает ли набор записей транзакции.

BOOL CanTransact() const;

Возвращаемое значение

Ненулевое значение, если набор записей разрешает транзакции; в противном случае — 0.

Замечания

Дополнительные сведения см. в разделе "Транзакция( ODBC)".

CRecordset::CanUpdate

Определяет, можно ли обновить набор записей.

BOOL CanUpdate() const;

Возвращаемое значение

Ненулевое значение, если набор записей можно обновить; в противном случае — 0.

Замечания

Набор записей может быть доступен только для чтения, если базовый источник данных доступен только для чтения или если указан CRecordset::readOnly в параметре dwOptions при открытии набора записей.

CRecordset::CheckRowsetError

Вызывается для обработки ошибок, создаваемых во время получения записей.

virtual void CheckRowsetError(RETCODE nRetCode);

Параметры

nRetCode
Код возврата функции API ODBC. Дополнительные сведения см. в разделе "Заметки".

Замечания

Эта функция-член обрабатывает ошибки, возникающие при получении записей и полезные во время массового получения строк. Может потребоваться переопределить CheckRowsetError реализацию собственной обработки ошибок.

CheckRowsetErrorвызывается автоматически в операции навигации курсора, например OpenRequery, или любой Move операции. Он передает возвращаемое значение функции SQLExtendedFetchAPI ODBC. В следующей nRetCode таблице перечислены возможные значения параметра.

nRetCode Description
SQL_SUCCESS Функция успешно завершена; дополнительные сведения недоступны.
SQL_SUCCESS_WITH_INFO Функция успешно завершена, возможно, с нефатальной ошибкой. Дополнительные сведения можно получить путем вызова SQLError.
SQL_NO_DATA_FOUND Все строки из результирующих наборов извлекены.
SQL_ERROR Сбой функции. Дополнительные сведения можно получить путем вызова SQLError.
SQL_INVALID_HANDLE Сбой функции из-за недопустимого дескриптора среды, дескриптора соединения или дескриптора инструкций. Это означает ошибку программирования. Дополнительные сведения не доступны.SQLError
SQL_STILL_EXECUTING Функция, запущенная асинхронно, по-прежнему выполняется. По умолчанию MFC никогда не будет передавать это значение CheckRowsetErrorв ; MFC продолжит вызываться SQLExtendedFetch до тех пор, пока он больше не возвращается SQL_STILL_EXECUTING.

Дополнительные сведения см SQLError. в пакете SDK для Windows. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

CRecordset::Close

Закрывает набор записей.

virtual void Close();

Замечания

OdBC HSTMT и все память, выделенные для набора записей, освобождены. Обычно после вызова Closeудаляется объект набора записей C++, если он был выделен.new

После вызова можно снова вызвать OpenClose. Это позволяет повторно использовать объект набора записей. Альтернативой является вызов Requery.

Пример

// Construct a snapshot object
CCustomer rsCustSet(NULL);

if (!rsCustSet.Open())
return;

// Use the snapshot ...

// Close the snapshot
rsCustSet.Close();

// Destructor is called when the function exits

CRecordset::CRecordset

Формирует объект CRecordset.

CRecordset(CDatabase* pDatabase = NULL);

Параметры

pDatabase
Содержит указатель на CDatabase объект или значение NULL. Если функция-член объекта Open не NULLCDatabase была вызвана для подключения к источнику данных, набор записей пытается открыть его для вас во время собственного Open вызова. При передаче NULLобъект создается и подключается для вас с помощью сведений об источнике данных, CDatabase указанных при производном классе наборов записей с помощью ClassWizard.

Замечания

Можно использовать CRecordset непосредственно или производный класс для конкретного приложения.CRecordset КлассWizard можно использовать для получения классов наборов записей.

Примечание.

Производный класс должен предоставить собственный конструктор. В конструкторе производного класса вызовите конструктор CRecordset::CRecordset, передавая соответствующие параметры вместе с ним.

Передайте NULL конструктор набора записей, чтобы CDatabase объект был создан и подключен автоматически. Это полезное краткое руководство, которое не требует создания и подключения CDatabase объекта до создания набора записей.

Пример

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

CRecordset::Delete

Удаляет текущую запись.

virtual void Delete();

Замечания

После успешного удаления элементы данных набора записей имеют значение NULL, и для удаления удаленной записи необходимо явно вызвать одну из Move функций. После отключения удаленной записи невозможно вернуться к ней. Если источник данных поддерживает транзакции, можно выполнить Delete вызов части транзакции. Дополнительные сведения см. в разделе "Транзакция( ODBC)".

Примечание.

Если вы реализовали массовое получение строк, вы не можете вызвать Delete. Это приведет к сбою утверждения. Хотя класс CRecordset не предоставляет механизм обновления массовых строк данных, вы можете написать собственные функции с помощью функции SQLSetPosAPI ODBC. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Внимание

Набор записей должен быть обновляемым, и при вызове Deleteнабора записей должна быть допустимая запись. В противном случае возникает ошибка. Например, если удалить запись, но не прокрутите новую запись перед вызовом Deleteеще раз, Delete вызовет CDBException.

В отличие AddNew от этого Edit, вызов Delete не следует вызову Update. Если вызов завершается сбоем Delete , элементы данных поля остаются неизменными.

Пример

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

// Create a derived CRecordset object
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();

if (rsCustSet.IsEOF() || !rsCustSet.CanUpdate() ||
   !rsCustSet.CanTransact())
{
   return;
}

m_dbCust.BeginTrans();

// Perhaps scroll to a new record...
// Delete the current record
rsCustSet.Delete();

// Finished commands for this transaction
if (IDYES == AfxMessageBox(_T("Commit transaction?"), MB_YESNO))
m_dbCust.CommitTrans();
else // User changed mind
m_dbCust.Rollback();

CRecordset::DoBulkFieldExchange

Вызывается для обмена массовыми строками данных из источника данных в набор записей. Реализует обмен полями массовой записи (BULK RFX).

virtual void DoBulkFieldExchange(CFieldExchange* pFX);

Параметры

pFX
Указатель на объект CFieldExchange. Платформа уже настроит этот объект, чтобы указать контекст для операции обмена полями.

Замечания

При реализации массового получения строк платформа вызывает эту функцию-член, чтобы автоматически передавать данные из источника данных в объект набора записей. DoBulkFieldExchange также привязывает члены данных параметров( если таковые есть) к заполнителям параметров в строке инструкции SQL для выбора набора записей.

Если массовое получение строк не реализовано, платформа вызывает DoFieldExchange. Чтобы реализовать массовое получение строк, необходимо указать CRecordset::useMultiRowFetch параметр dwOptions в функции-члене Open .

Примечание.

DoBulkFieldExchange доступен только в том случае, если используется класс, производный от CRecordset. Если вы создали объект набора записей непосредственно из CRecordset, необходимо вызвать GetFieldValue функцию-член для получения данных.

Обмен полями массовой записи (Bulk RFX) аналогичен обмену полями записей (RFX). Данные автоматически передаются из источника данных в объект набора записей. Однако вы не можете вызывать AddNew, EditDeleteили Update передавать изменения обратно в источник данных. В настоящее время класс CRecordset не предоставляет механизм обновления массовых строк данных. Однако вы можете написать собственные функции с помощью функции SQLSetPosAPI ODBC.

ClassWizard не поддерживает обмен полями массовой записи; Таким образом, необходимо вручную переопределить DoBulkFieldExchange вызовы функций BULK RFX. Дополнительные сведения об этих функциях см. в разделе "Функции Exchange полей записи".

Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC). Дополнительные сведения см. в разделе "Обмен полями записей" (RFX).

CRecordset::DoFieldExchange

Вызывается для обмена данными (в обоих направлениях) между элементами данных поля набора записей и соответствующей записью в источнике данных. Реализует обмен полями записей (RFX).

virtual void DoFieldExchange(CFieldExchange* pFX);

Параметры

pFX
Указатель на объект CFieldExchange. Платформа уже настроит этот объект, чтобы указать контекст для операции обмена полями.

Замечания

Если массовое получение строк не реализовано, платформа вызывает эту функцию-член для автоматического обмена данными между элементами данных поля объекта набора записей и соответствующими столбцами текущей записи в источнике данных. DoFieldExchange также привязывает члены данных параметров( если таковые есть) к заполнителям параметров в строке инструкции SQL для выбора набора записей.

Если выполняется массовое получение строк, платформа вызывает DoBulkFieldExchange. Чтобы реализовать массовое получение строк, необходимо указать CRecordset::useMultiRowFetch параметр dwOptions в функции-члене Open .

Примечание.

DoFieldExchange доступен только в том случае, если используется класс, производный от CRecordset. Если вы создали объект набора записей непосредственно из CRecordset, необходимо вызвать функцию-член GetFieldValue , чтобы получить данные.

Обмен данными поля, называемым обменом полями записей (RFX), работает в обоих направлениях: от элементов данных объекта набора записей к полям записи источника данных и из записи в источнике данных в объект набора записей.

Единственное действие, которое необходимо выполнить DoFieldExchange для класса производного набора записей, — создать класс с помощью ClassWizard и указать имена и типы данных элементов данных поля. Вы также можете добавить код в то, что классWizard записывает, чтобы указать члены данных параметров или работать с любыми столбцами, которые вы привязываете динамически. Дополнительные сведения см. в разделе Recordset: динамически привязка столбцов данных (ODBC).

При объявлении класса производного набора записей с помощью ClassWizard мастер записывает переопределение DoFieldExchange для вас, которое напоминает следующий пример:

void CCustomer::DoFieldExchange(CFieldExchange* pFX)
{
   pFX->SetFieldType(CFieldExchange::outputColumn);
   // Macros such as RFX_Text() and RFX_Int() are dependent on the
   // type of the member variable, not the type of the field in the database.
   // ODBC will try to automatically convert the column value to the requested type
   RFX_Long(pFX, _T("[CustomerID]"), m_CustomerID);
   RFX_Text(pFX, _T("[ContactFirstName]"), m_ContactFirstName);
   RFX_Text(pFX, _T("[PostalCode]"), m_PostalCode);
   RFX_Text(pFX, _T("[L_Name]"), m_L_Name);
   RFX_Long(pFX, _T("[BillingID]"), m_BillingID);

   pFX->SetFieldType(CFieldExchange::inputParam);
   RFX_Text(pFX, _T("Param"), m_strParam);
}

Дополнительные сведения о функциях RFX см. в разделе "Функции Exchange полей записи".

Дополнительные примеры и сведения о ней см. в DoFieldExchangeразделе "Обмен полями записей": принцип работы RFX. Общие сведения о RFX см. в разделе "Обмен полями записей".

CRecordset::Edit

Разрешает изменения текущей записи.

virtual void Edit();

Замечания

После вызова Editможно изменить элементы данных поля, сбросив их значения напрямую. Операция завершается при вызове Update функции-члена для сохранения изменений в источнике данных.

Примечание.

Если вы реализовали массовое получение строк, вы не можете вызвать Edit. Это приведет к сбою утверждения. Хотя класс CRecordset не предоставляет механизм обновления массовых строк данных, вы можете написать собственные функции с помощью функции SQLSetPosAPI ODBC. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Edit сохраняет значения элементов данных набора записей. При вызове EditEdit внесите изменения, вызовите снова, значения записи восстанавливаются до первого Edit вызова.

В некоторых случаях может потребоваться обновить столбец, сделав его null (не содержащим данных). Для этого вызовите SetFieldNull параметр TRUE, чтобы пометить поле NULL. Это также приводит к обновлению столбца. Если вы хотите записать поле в источник данных, даже если его значение не изменилось, вызовите SetFieldDirty параметр TRUE. Это работает, даже если поле имеет значение NULL.

Если источник данных поддерживает транзакции, можно выполнить Edit вызов части транзакции. Вызов CDatabase::BeginTrans до вызова Edit и после открытия набора записей. Кроме того, вызов CDatabase::CommitTrans не является заменой вызова Update для завершения Edit операции. Дополнительные сведения о транзакциях см. в классе CDatabase.

В зависимости от текущего режима блокировки обновляемая запись может быть заблокирована Edit до вызова Update или прокрутки другой записи или ее блокировки только во время Edit вызова. Вы можете изменить режим блокировки с помощью SetLockingMode.

Предыдущее значение текущей записи восстанавливается при прокрутке до новой записи перед вызовом Update. Вызывается CDBException при вызове Edit набора записей, который не может быть обновлен или если текущая запись отсутствует.

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

Пример

// To edit a record, first set up the edit buffer
rsCustSet.Edit();

// Then edit field data members for the record
rsCustSet.m_BillingID = 2795;
rsCustSet.m_ContactFirstName = _T("Jones Mfg");

// Finally, complete the operation
if (!rsCustSet.Update())
{
   // Handle the failure to update
   AfxMessageBox(_T("Couldn't update record!"));
}

CRecordset::FlushResultSet

Извлекает следующий результирующий набор предопределенного запроса (хранимой процедуры), если существует несколько результирующих наборов.

BOOL FlushResultSet();

Возвращаемое значение

Ненулевое значение, если требуется извлечь больше результирующих наборов; в противном случае — 0.

Замечания

Вызов следует вызывать FlushResultSet только после завершения курсора в текущем результирующем наборе. При получении следующего результирующий набор путем вызова FlushResultSetкурсор недействителен в этом результирующем MoveNext наборе. После вызова FlushResultSetследует вызвать функцию-член.

Если предопределенный запрос использует выходной параметр или входные или выходные параметры, необходимо вызвать FlushResultSet , пока он не возвращает FALSE(значение 0), чтобы получить эти значения параметров.

FlushResultSet вызывает функцию SQLMoreResultsAPI ODBC. При SQLMoreResults возврате SQL_ERROR или SQL_INVALID_HANDLEвызовет FlushResultSet исключение. Дополнительные сведения см SQLMoreResults. в пакете SDK для Windows.

Хранимая процедура должна иметь привязанные поля, если вы хотите вызвать FlushResultSet.

Пример

В следующем коде предполагается, что COutParamRecordset это производный CRecordsetобъект на основе предопределенного запроса с входным параметром и выходным параметром, а также с несколькими результирующих наборами. Обратите внимание на структуру DoFieldExchange переопределения.

// DoFieldExchange override
//
// Only necessary to handle parameter bindings.
// Don't use CRecordset-derived class with bound
// fields unless all result sets have same schema
// OR there is conditional binding code.
void CCourses::DoFieldExchange(CFieldExchange* pFX)
{
   pFX->SetFieldType(CFieldExchange::outputParam);
   RFX_Long(pFX, _T("Param1"), m_nCountParam);
   // The "Param1" name here is a dummy name 
   // that is never used

   pFX->SetFieldType(CFieldExchange::inputParam);
   RFX_Text(pFX, _T("Param2"), m_strNameParam);
   // The "Param2" name here is a dummy name 
   // that is never used
}

 

// Assume db is an already open CDatabase object
CCourses rs(&m_dbCust);
rs.m_strNameParam = _T("History");

// Get the first result set
// NOTE: SQL Server requires forwardOnly cursor 
//       type for multiple rowset returning stored 
//       procedures
rs.Open(CRecordset::forwardOnly,
   _T("{? = CALL GetCourses( ? )}"),
   CRecordset::readOnly);

// Loop through all the data in the first result set
while (!rs.IsEOF())
{
   CString strFieldValue;
   for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
   {
      rs.GetFieldValue(nIndex, strFieldValue);

      // TO DO: Use field value string.
   }
   rs.MoveNext();
}

// Retrieve other result sets...
while (rs.FlushResultSet())
{
   // must call MoveNext because cursor is invalid
   rs.MoveNext();

   while (!rs.IsEOF())
   {
      CString strFieldValue;
      for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
      {
         rs.GetFieldValue(nIndex, strFieldValue);

         // TO DO: Use field value string.
      }
      rs.MoveNext();
   }
}


// All result sets have been flushed. Cannot
// use the cursor, but the output parameter,
// m_nCountParam, has now been written.
// Note that m_nCountParam is not valid until
// CRecordset::FlushResultSet has returned FALSE,
// indicating no more result sets will be returned.

// TO DO: Use m_nCountParam

// Cleanup
rs.Close();

CRecordset::GetBookmark

Получает значение закладки для текущей записи.

void GetBookmark(CDBVariant& varBookmark);

Параметры

varBookmark
Ссылка на CDBVariant объект, представляющий закладку в текущей записи.

Замечания

Чтобы определить, поддерживаются ли закладки в наборе записей, вызовите CanBookmark. Чтобы сделать закладки доступными, если они поддерживаются, необходимо задать CRecordset::useBookmarks параметр в dwOptions параметре Open функции-члена.

Примечание.

Если закладки не поддерживаются или недоступны, вызов GetBookmark приведет к возникновению исключения. Закладки не поддерживаются в наборах записей только для пересылки.

GetBookmark присваивает значение закладки для текущей записи объекту CDBVariant . Чтобы вернуться к этой записи в любое время после перехода в другую запись, вызовите SetBookmark соответствующий CDBVariant объект.

Примечание.

После определенных операций набора записей закладки больше не могут быть допустимыми. Например, при вызовеGetBookmark, за которым следуетRequery, возможно, вы не сможете вернуться к записи.SetBookmark Вызовите CDatabase::GetBookmarkPersistence проверка, можно ли безопасно вызватьSetBookmark.

Дополнительные сведения о навигации по закладкам и наборам записей см. в статьях Recordset: Bookmarks and Absolute Positions (ODBC) и Recordset: Scrolling (ODBC).

CRecordset::GetDefaultConnect

Вызывается для получения строка подключения по умолчанию.

virtual CString GetDefaultConnect();

Возвращаемое значение

Значение, CString содержащее строка подключения по умолчанию.

Замечания

Платформа вызывает эту функцию-член, чтобы получить строка подключения по умолчанию для источника данных, на котором основан набор записей. ClassWizard реализует эту функцию, определяя тот же источник данных, который ClassWizard используется для получения сведений о таблицах и столбцах. Возможно, вам удобно использовать это подключение по умолчанию при разработке приложения. Но подключение по умолчанию может не соответствовать пользователям приложения. Если это так, следует повторно выполнить эту функцию, dis карта ing ClassWizardверсии. Дополнительные сведения о строка подключения см. в разделе "Источник данных( ODBC)".

CRecordset::GetDefaultSQL

Вызывается для получения строки SQL по умолчанию для выполнения.

virtual CString GetDefaultSQL();

Возвращаемое значение

Значение, CString содержащее инструкцию SQL по умолчанию.

Замечания

Платформа вызывает эту функцию-член, чтобы получить инструкцию SQL по умолчанию, на которой основан набор записей. Это может быть имя таблицы или инструкция SQL SELECT .

Вы косвенно определяете инструкцию SQL по умолчанию, объявляя класс набора записей с ClassWizardпомощью и ClassWizard выполняя эту задачу.

Если вам нужна строка инструкции SQL для собственного использования, вызов GetSQL, который возвращает инструкцию SQL, используемую для выбора записей набора записей при открытии. Вы можете изменить строку SQL по умолчанию в переопределении GetDefaultSQLкласса. Например, можно указать вызов предопределенного запроса с помощью инструкции CALL . (Обратите внимание, что при изменении GetDefaultSQLтакже необходимо изменить m_nFields количество столбцов в источнике данных.)

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

Внимание

Имя таблицы будет пустым, если платформа не могла определить имя таблицы, если были предоставлены несколько имен таблиц или если CALL оператор не удалось интерпретировать. При использовании инструкции CALL не вставляйте пробелы между фигурной скобкой и CALL ключевое слово, ни перед фигурной скобкой или перед SELECT ключевое слово в инструкцииSELECT.

CRecordset::GetFieldValue

Извлекает данные поля в текущей записи.

void GetFieldValue(
    LPCTSTR lpszName,
    CDBVariant& varValue,
    short nFieldType = DEFAULT_FIELD_TYPE);

void GetFieldValue(
    LPCTSTR lpszName,
    CStringA& strValue
);

void GetFieldValue(
    LPCTSTR lpszName,
    CStringW& strValue
);

void GetFieldValue(
    short nIndex,
    CDBVariant& varValue,
    short nFieldType = DEFAULT_FIELD_TYPE);

void GetFieldValue(
    short nIndex,
    CStringA& strValue);

void GetFieldValue(
    short nIndex,
    CStringW& strValue);

Параметры

lpszName
Имя поля.

varValue Ссылка на CDBVariant объект, который будет хранить значение поля.

nFieldType
Тип данных ODBC C поля. Используя значение по умолчанию, DEFAULT_FIELD_TYPEпринудительно GetFieldValue определяет тип данных C из типа данных SQL на основе следующей таблицы. В противном случае можно указать тип данных непосредственно или выбрать совместимый тип данных; например, можно хранить любой тип данных в SQL_C_CHAR.

Тип данных C Тип данных SQL
SQL_C_BIT SQL_BIT
SQL_C_UTINYINT SQL_TINYINT
SQL_C_SSHORT SQL_SMALLINT
SQL_C_SLONG SQL_INTEGER
SQL_C_FLOAT SQL_REAL
SQL_C_DOUBLE SQL_FLOATSQL_DOUBLE
SQL_C_TIMESTAMP SQL_DATESQL_TIMESQL_TIMESTAMP
SQL_C_CHAR SQL_NUMERICSQL_DECIMALSQL_BIGINTSQL_CHARSQL_VARCHARSQL_LONGVARCHAR
SQL_C_BINARY SQL_BINARYSQL_VARBINARYSQL_LONGVARBINARY

Дополнительные сведения о типах данных ODBC см. в разделах "Типы данных SQL" и "Типы данных C" в приложении D пакета SDK для Windows.

nIndex
Отсчитываемый от нуля индекс поля.

strValue
Ссылка на CString объект, который будет хранить значение поля, преобразованное в текст, независимо от типа данных поля.

Замечания

Поле можно найти по имени или по индексу. Значение поля можно хранить в объекте CDBVariant или объекте CString .

Если вы реализовали массовое получение строк, текущая запись всегда размещается на первой записи в наборе строк. Чтобы использовать GetFieldValue запись в заданном наборе строк, необходимо сначала вызвать SetRowsetCursorPosition функцию-член, чтобы переместить курсор в нужную строку в этом наборе строк. Затем вызовите GetFieldValue для этой строки. Чтобы реализовать массовое получение строк, необходимо указать CRecordset::useMultiRowFetch параметр dwOptions в функции-члене Open .

Вы можете использовать GetFieldValue динамические выборки полей во время выполнения, а не статически привязывать их во время разработки. Например, если вы объявили объект набора записей непосредственно из CRecordset, необходимо использовать GetFieldValue для получения данных поля; обмен полями записей (RFX) или обмен полями массовой записи (Bulk RFX), не реализуется.

Примечание.

Если вы объявляете объект набора записей без производных от CRecordsetних, не загружается библиотека курсоров ODBC. Для библиотеки курсоров требуется, чтобы набор записей имеет по крайней мере один привязанный столбец; однако при использовании CRecordset напрямую ни один из столбцов не привязан. Функции-члены CDatabase::OpenEx и CDatabase::Open управление загрузкой библиотеки курсоров.

GetFieldValue вызывает функцию SQLGetDataAPI ODBC. Если драйвер выводит значение SQL_NO_TOTAL для фактической длины значения поля, GetFieldValue создается исключение. Дополнительные сведения см SQLGetData. в пакете SDK для Windows.

Пример

В следующем примере кода показаны вызовы GetFieldValue объекта набора записей, объявленного непосредственно из CRecordset.

// Create and open a database object;
// do not load the cursor library
CDatabase db;
db.OpenEx(NULL, CDatabase::forceOdbcDialog);

// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM Customer"));

// Create a CDBVariant object to
// store field data
CDBVariant varValue;

// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount();
while (!rs.IsEOF())
{
   for (short index = 0; index < nFields; index++)
   {
      rs.GetFieldValue(index, varValue);
      // do something with varValue
   }
   rs.MoveNext();
}

rs.Close();
db.Close();

Примечание.

В отличие от класса CDaoRecordsetDAO, CRecordset не имеет SetFieldValue функции-члены. Если вы создаете объект непосредственно из CRecordset, оно эффективно доступно только для чтения.

Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

CRecordset::GetODBCFieldCount

Извлекает общее количество полей в объекте набора записей.

short GetODBCFieldCount() const;

Возвращаемое значение

Количество полей в наборе записей.

Замечания

Дополнительные сведения о создании наборов записей см. в разделе Recordset: Создание и закрытие наборов записей (ODBC).

CRecordset::GetODBCFieldInfo

Получает сведения о полях в наборе записей.

void GetODBCFieldInfo(
    LPCTSTR lpszName,
    CODBCFieldInfo& fieldinfo);

void GetODBCFieldInfo(
    short nIndex,
    CODBCFieldInfo& fieldinfo);

Параметры

lpszName
Имя поля.

fieldinfo
Ссылка на структуру CODBCFieldInfo .

nIndex
Отсчитываемый от нуля индекс поля.

Замечания

Одна из версий функции позволяет искать поле по имени. Другая версия позволяет искать поле по индексу.

Описание возвращаемых сведений см. в CODBCFieldInfo структуре.

Дополнительные сведения о создании наборов записей см. в разделе Recordset: Создание и закрытие наборов записей (ODBC).

CRecordset::GetRecordCount

Определяет размер набора записей.

long GetRecordCount() const;

Возвращаемое значение

Количество записей в наборе записей; Значение 0, если набор записей не содержит записей; или -1, если не удается определить число записей.

Замечания

Внимание

Число записей сохраняется как "высокая водяной знак", самая высокая нумерованная запись, пока не рассматривается, как пользователь перемещается через записи. Общее количество записей известно только после того, как пользователь перешел за пределы последней записи. По соображениям производительности количество не обновляется при вызове MoveLast. Чтобы подсчитать записи самостоятельно, вызовите MoveNext повторно до тех пор, пока не IsEOF возвращается ненулевое значение. Добавление записи с помощью CRecordset:AddNew и Update увеличение числа; удаление записи с помощью CRecordset::Delete уменьшения количества.

CRecordset::GetRowsetSize

Получает текущий параметр для количества строк, которые требуется получить во время заданного получения.

DWORD GetRowsetSize() const;

Возвращаемое значение

Количество строк, извлекаемых во время заданного получения.

Замечания

Если вы используете массовое получение строк, размер набора строк по умолчанию при открытии набора записей равен 25; в противном случае это значение 1.

Чтобы реализовать массовое получение строк, необходимо указать CRecordset::useMultiRowFetch параметр в dwOptions параметре Open функции-члена. Чтобы изменить параметр для размера набора строк, вызовите .SetRowsetSize

Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

CRecordset::GetRowsFetched

Определяет количество записей, полученных после получения.

DWORD GetRowsFetched() const;

Возвращаемое значение

Количество строк, полученных из источника данных после заданного получения.

Замечания

Это полезно при реализации массового получения строк. Размер набора строк обычно указывает, сколько строк будет извлечено из набора. Однако общее количество строк в наборе записей также влияет на количество строк в наборе строк. Например, если набор записей имеет 10 записей с параметром размера набора строк 4, то циклирование по набору записей путем вызова MoveNext приведет к тому, что окончательный набор строк содержит только две записи.

Чтобы реализовать массовое получение строк, необходимо указать CRecordset::useMultiRowFetch параметр в параметре Open dwOptions функции-члена. Чтобы указать размер набора строк, вызовите SetRowsetSize.

Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Пример

CMultiCustomer rs(&m_dbCust);

// Set the rowset size
rs.SetRowsetSize(5);

// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);

// loop through the recordset by rowsets
while (!rs.IsEOF())
{
   for (int rowCount = 0; rowCount < (int)rs.GetRowsFetched(); rowCount++)
   {
      // do something
   }

   rs.MoveNext();
}

rs.Close();

CRecordset::GetRowStatus

Получает состояние строки в текущем наборе строк.

WORD GetRowStatus(WORD wRow) const;

Параметры

wRow
Одноуровневая позиция строки в текущем наборе строк. Это значение может быть от 1 до размера набора строк.

Возвращаемое значение

Значение состояния для строки. Дополнительные сведения см. в разделе "Заметки".

Замечания

GetRowStatus возвращает значение, указывающее либо любое изменение состояния строки, так как оно было извлечено из источника данных или что строка, соответствующая wRow значению, не была получена. В следующей таблице перечислены возможные возвращаемые значения.

Значение состояния Description
SQL_ROW_SUCCESS Строка не изменяется.
SQL_ROW_UPDATED Строка была обновлена.
SQL_ROW_DELETED Строка удалена.
SQL_ROW_ADDED Добавлена строка.
SQL_ROW_ERROR Строка не возвращается из-за ошибки.
SQL_ROW_NOROW Строка не соответствует wRow.

Дополнительные сведения см. в функции SQLExtendedFetch API ODBC в пакете SDK для Windows.

CRecordset::GetStatus

Определяет индекс текущей записи в наборе записей и указывает, была ли обнаружена последняя запись.

void GetStatus(CRecordsetStatus& rStatus) const;

Параметры

rStatus
Ссылка на объект CRecordsetStatus. Дополнительные сведения см. в разделе Замечания.

Замечания

CRecordset пытается отслеживать индекс, но в некоторых случаях это может быть невозможно. См GetRecordCount . описание.

Структура CRecordsetStatus имеет следующую форму:

struct CRecordsetStatus
{
    long m_lCurrentRecord;
    BOOL m_bRecordCountFinal;
};

Два члена CRecordsetStatus имеют следующие значения:

  • m_lCurrentRecord Содержит отсчитываемый от нуля индекс текущей записи в наборе записей, если он известен. Если индекс не удается определить, этот элемент содержит AFX_CURRENT_RECORD_UNDEFINED (-2). Если IsBOF задано значение TRUE (пустой набор записей или попытка прокручиваться перед первой записью), то m_lCurrentRecord задается значение AFX_CURRENT_RECORD_BOF (-1). Если в первой записи установлено значение 0, вторая запись 1 и т. д.

  • m_bRecordCountFinal Ненулевое значение, если общее количество записей в наборе записей определено. Как правило, это необходимо сделать, начиная с начала набора записей и вызывая MoveNext до тех пор, пока не IsEOF возвращается ненулевое значение. Если этот элемент равен нулю, число записей, возвращаемых GetRecordCount,если не -1, является только числом "высокий водяной знак" записей.

CRecordset::GetSQL

Вызовите эту функцию-член, чтобы получить инструкцию SQL, которая использовалась для выбора записей набора записей при открытии.

const CString& GetSQL() const;

Возвращаемое значение

Ссылка const на инструкцию CString SQL.

Замечания

Как правило, это инструкция SQL SELECT . Строка, возвращаемая GetSQL только для чтения.

Строка, возвращаемая GetSQL обычно отличается от любой строки, которую вы могли передать набору записей в lpszSQL параметре Open функции-члену. Это связано с тем, что набор записей создает полную инструкцию SQL на основе переданных Openданных, заданных вами, то, что ClassWizardвы указали в m_strFilter элементах данных и m_strSort элементах данных, а также все указанные параметры. Дополнительные сведения о том, как набор записей создает эту инструкцию SQL, см. в разделе Recordset: How Recordsets Select Records (ODBC).

Примечание.

Вызов этой функции-член только после вызова Open.

CRecordset::GetTableName

Возвращает имя таблицы SQL, на которой основан запрос набора записей.

const CString& GetTableName() const;

Возвращаемое значение

Ссылка const на CString имя таблицы, содержащая имя таблицы, если набор записей основан на таблице; в противном случае — пустая строка.

Замечания

GetTableName допустимо только в том случае, если набор записей основан на таблице, а не на присоединении нескольких таблиц или предопределенном запросе (хранимой процедуре). Имя доступно только для чтения.

Примечание.

Вызов этой функции-член только после вызова Open.

CRecordset::IsBOF

Возвращает ненулевое значение, если набор записей был размещен до первой записи. Текущая запись отсутствует.

BOOL IsBOF() const;

Возвращаемое значение

Ненулевое значение, если набор записей не содержит записей или если вы прокрутили назад до первой записи; в противном случае — 0.

Замечания

Вызовите эту функцию-член, прежде чем прокручивать запись до записи, чтобы узнать, прошли ли вы перед первой записью набора записей. Вы также можете использовать IsBOF вместе с IsEOF тем, чтобы определить, содержит ли набор записей любые записи или пуст. Сразу после вызова Open, если набор записей не содержит записей, IsBOF возвращает ненулевое значение. При открытии набора записей, имеющего по крайней мере одну запись, первая запись является текущей и IsBOF возвращает значение 0.

Если первая запись является текущей и вызывается MovePrev, IsBOF возвращается ненулевое значение. Если IsBOF возвращается ненулевое значение и вызывается MovePrev, возникает ошибка. Если IsBOF возвращается ненулевое значение, текущая запись не определена, и любое действие, требующее текущей записи, приведет к ошибке.

Пример

В этом примере используется IsBOF и IsEOF определяется ограничения набора записей, так как код прокручивает набор записей в обоих направлениях.

// Open a recordset; first record is current
// Open a recordset; first record is current
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();

if(rsCustSet.IsBOF())
   return;
   // The recordset is empty

// Scroll to the end of the recordset, past
// the last record, so no record is current
while (!rsCustSet.IsEOF())
   rsCustSet.MoveNext();

// Move to the last record
rsCustSet.MoveLast();

// Scroll to beginning of the recordset, before
// the first record, so no record is current
while(!rsCustSet.IsBOF())
   rsCustSet.MovePrev();

// First record is current again
rsCustSet.MoveFirst();

CRecordset::IsDeleted

Определяет, удалена ли текущая запись.

BOOL IsDeleted() const;

Возвращаемое значение

Ненулевое значение, если набор записей расположен в удаленной записи; в противном случае — 0.

Замечания

Если прокрутите запись и IsDeleted возвращаете TRUE (ненулевое), необходимо прокрутить другую запись перед выполнением других операций набора записей.

Результат IsDeleted зависит от многих факторов, таких как тип набора записей, независимо от того, является ли набор записей обновляемым, указан CRecordset::skipDeletedRecords ли параметр при открытии набора записей, независимо от того, удаляются ли пакеты драйверов и есть ли несколько пользователей.

Дополнительные сведения о упаковке драйверов CRecordset::skipDeletedRecords см. в функции Open Member.

Примечание.

Если вы реализовали массовое получение строк, не следует вызывать IsDeleted. Вместо этого вызовите функцию-член GetRowStatus . Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

CRecordset::IsEOF

Возвращает ненулевое значение, если набор записей был размещен после последней записи. Текущая запись отсутствует.

BOOL IsEOF() const;

Возвращаемое значение

Ненулевое значение, если набор записей не содержит записей или если вы прокрутили последнюю запись; в противном случае — 0.

Замечания

Вызовите эту функцию-член по мере прокрутки записи до записи, чтобы узнать, выходите ли вы за рамки последней записи набора записей. Можно также использовать IsEOF для определения того, содержит ли набор записей любые записи или пуст. Сразу после вызова Open, если набор записей не содержит записей, IsEOF возвращает ненулевое значение. При открытии набора записей, имеющего по крайней мере одну запись, первая запись является текущей и IsEOF возвращает значение 0.

Если последняя запись является текущей записью при вызове MoveNext, IsEOF возвращается ненулевое значение. Если IsEOF возвращается ненулевое значение и вызывается MoveNext, возникает ошибка. Если IsEOF возвращается ненулевое значение, текущая запись не определена, и любое действие, требующее текущей записи, приведет к ошибке.

Пример

Пример см. в примере IsBOF.

CRecordset::IsFieldDirty

Определяет, был ли изменен указанный элемент данных поля с момента Edit или AddNew был вызван.

BOOL IsFieldDirty(void* pv);

Параметры

pv
Указатель на элемент данных поля, состояние которого требуется проверка, или NULL определить, грязное ли какое-либо из полей.

Возвращаемое значение

Ненулевое значение, если указанный элемент данных поля изменился с момента вызова AddNew или ; в Editпротивном случае — 0.

Замечания

Данные во всех элементах данных поля грязное будут переданы в запись в источнике данных при обновлении текущей записи вызовом Update функции-члена CRecordset (после вызова Edit илиAddNew).

Примечание.

Эта функция-член не применима к наборам записей, использующим массовое получение строк. Если вы реализовали массовое получение строк, IsFieldDirty всегда возвращает значение FALSE и приведет к сбою утверждения. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Вызов IsFieldDirty сбрасывает эффекты предыдущих вызовов SetFieldDirty, так как состояние грязное поля переоценено. В случае, если текущее AddNew значение поля отличается от псевдопустого значения, состояние поля устанавливается грязное. Edit В случае, если значение поля отличается от кэшированного значения, то состояние поля устанавливается грязное.

IsFieldDirty реализуется через DoFieldExchange.

Дополнительные сведения о флаге грязное см. в разделе Recordset: How Recordsets Select Records (ODBC).

CRecordset::IsFieldNull

Возвращает ненулевое значение, если указанное поле в текущей записи равно NULL (не имеет значения).

BOOL IsFieldNull(void* pv);

Параметры

pv
Указатель на элемент данных поля, состояние которого требуется проверка, или NULL определить, имеет ли какой-либо из полей значение NULL.

Возвращаемое значение

Ненулевое значение, если указанный элемент данных поля помечен как NULL; в противном случае — 0.

Замечания

Вызовите эту функцию-член, чтобы определить, был ли указанный элемент данных поля набора записей помечен как NULL. (В терминологии базы данных null означает "отсутствие значения" и не NULL совпадает с C++.) Если элемент данных поля помечен как NULL, он интерпретируется как столбец текущей записи, для которой нет значения.

Примечание.

Эта функция-член не применима к наборам записей, использующим массовое получение строк. Если вы реализовали массовое получение строк, всегда IsFieldNull возвращается FALSE и приведет к сбою утверждения. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

IsFieldNull реализуется через DoFieldExchange.

CRecordset::IsFieldNullable

Возвращает ненулевое значение, если указанное поле в текущей записи может иметь значение NULL (без значения).

BOOL IsFieldNullable(void* pv);

Параметры

pv
Указатель на элемент данных поля, состояние которого требуется проверка, или NULL определить, может ли любой из полей иметь значение NULL.

Замечания

Вызовите эту функцию-член, чтобы определить, является ли указанный элемент данных поля значением NULL (можно задать значение NULL; C++ NULL не совпадает с значением NULL, которое в терминологии базы данных означает "отсутствие значения").

Примечание.

Если вы реализовали массовое получение строк, вы не можете вызвать IsFieldNullable. Вместо этого вызовите GetODBCFieldInfo функцию-член, чтобы определить, может ли поле иметь значение NULL. Вы всегда можете вызывать GetODBCFieldInfo, независимо от того, реализована ли массовая выборка строк. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Поле, которое не может иметь значение NULL. Если при добавлении или обновлении записи для такого поля задано значение NULL, источник данных отклоняет добавление или обновление и Update вызовет исключение. Исключение возникает при вызове Update, а не при вызове SetFieldNull.

Использование NULL первого аргумента функции будет применять функцию только к полям, а не param к outputColumn полям. Например, вызов

SetFieldNull(NULL);

значение <>NULL/>, если задано значение только outputColumn полей; param поля не будут затронуты.

Для работы с param полями необходимо указать фактический адрес человека param , над которым вы хотите работать, например:

SetFieldNull(&m_strParam);

Это означает, что вы не можете задать для всех param полей NULLзначение , так как можно использовать outputColumn поля.

IsFieldNullable реализуется через DoFieldExchange.

CRecordset::IsOpen

Определяет, открыт ли набор записей.

BOOL IsOpen() const;

Возвращаемое значение

Ненулевое значение, если функция объекта Open набора записей или Requery члена ранее была вызвана, и набор записей не был закрыт; в противном случае — 0.

CRecordset::m_hstmt

Содержит дескриптор структуры данных инструкции ODBC типа, связанной HSTMTс набором записей.

Замечания

Каждый запрос к источнику данных ODBC связан с HSTMT.

Внимание

Не используйте m_hstmt до Open вызова.

Как правило, вам не нужно обращаться к HSTMT напрямую, но может потребоваться для прямого выполнения инструкций SQL. Функция-член ExecuteSQL класса CDatabase предоставляет пример использования m_hstmt.

CRecordset::m_nFields

Содержит количество элементов данных поля в классе наборов записей; то есть количество столбцов, выбранных набором записей из источника данных.

Замечания

Конструктор класса наборов записей должен инициализировать m_nFields с правильным числом. Если вы не реализовали массовое получение строк, ClassWizard записывает эту инициализацию при его использовании для объявления класса наборов записей. Вы также можете написать его вручную.

Платформа использует это число для управления взаимодействием между элементами данных поля и соответствующими столбцами текущей записи в источнике данных.

Внимание

Это число должно соответствовать количеству "выходных столбцов", зарегистрированных или DoFieldExchangeDoBulkFieldExchange после вызова SetFieldType с параметром CFieldExchange::outputColumn.

Столбцы можно привязать динамически, как описано в статье "Набор записей: динамически привязка столбцов данных". При этом необходимо увеличить количество m_nFields вызовов функции RFX или Bulk RFX в функции-члене DoFieldExchangeDoBulkFieldExchange для динамически привязанных столбцов.

Дополнительные сведения см. в статьях Recordset: динамически привязка столбцов данных (ODBC) и набора записей: получение записей в массовой части (ODBC).

Пример

см. раздел "Обмен полями записей": использование RFX.

CRecordset::m_nParams

Содержит число элементов данных параметров в классе наборов записей; То есть количество параметров, переданных запросом набора записей.

Замечания

Если в классе наборов записей есть элементы данных параметров, конструктор класса должен инициализировать m_nParams с правильным числом. Значение m_nParams по умолчанию равно 0. При добавлении элементов данных параметров (которые необходимо сделать вручную) необходимо также вручную добавить инициализацию в конструктор класса, чтобы отразить количество параметров (которое должно быть не менее большим, чем число заполнителей в вашей m_strFilter или m_strSort строке).

Платформа использует это число при параметризации запроса набора записей.

Внимание

Это число должно соответствовать числу "params", зарегистрированному в DoFieldExchange или после вызова SetFieldType со значением CFieldExchange::inputParamпараметра , CFieldExchange::outputParamCFieldExchange::paramили CFieldExchange::inoutParam.DoBulkFieldExchange

Пример

См. статьи Recordset: параметризация набора записей (ODBC) и Exchange полей записей: использование RFX.

CRecordset::m_pDatabase

Содержит указатель на CDatabase объект, через который набор записей подключен к источнику данных.

Замечания

Эта переменная устанавливается двумя способами. Как правило, вы передаете указатель на уже подключенный CDatabase объект при создании объекта набора записей. Если вы передаете NULL вместо этого, CRecordset создает CDatabase объект для вас и подключает его. В любом случае хранит CRecordset указатель в этой переменной.

Обычно вам не потребуется напрямую использовать указатель, хранящийся в m_pDatabase. Однако при написании собственных расширений CRecordsetможет потребоваться использовать указатель. Например, вам может потребоваться указатель, если вы создаете собственные CDBException. Или вам может потребоваться, если вам нужно сделать что-то с помощью того же CDatabase объекта, например выполнения транзакций, установки времени ожидания или вызова ExecuteSQL функции-члена класса CDatabase для выполнения инструкций SQL напрямую.

CRecordset::m_strFilter

После создания объекта набора записей, но перед вызовом функции-члена Open используйте этот элемент данных для хранения CString предложения SQL WHERE .

Замечания

Набор записей использует эту строку для ограничения (или фильтрации) записей, которые он выбирает во время Open или Requery вызова. Это полезно для выбора подмножества записей, таких как "все продавцы, базирующиеся в Калифорнии" ("state = CA"). Синтаксис ODBC SQL для WHERE предложения

WHERE search-condition

Не включайте WHERE ключевое слово в строку. Платформа предоставляет ее.

Вы также можете параметризовать строку фильтра, поместив в нее заполнители "", объявив элемент данных параметра в классе для каждого заполнителя и передав параметры набору записей во время выполнения. Это позволяет создавать фильтр во время выполнения. Дополнительные сведения см. в разделе Recordset: параметризация набора записей (ODBC).

Дополнительные сведения о предложениях SQL см. в статье SQLWHERE. Дополнительные сведения о выборе и фильтрации записей см. в разделе Recordset: Filtering Records (ODBC).

Пример

CCustomer rsCustSet(&m_dbCust);

// Set the filter
rsCustSet.m_strFilter = _T("L_Name = 'Flanders'");

// Run the filtered query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));

CRecordset::m_strSort

После создания объекта набора записей, но перед вызовом функции-члена Open используйте этот элемент данных для хранения CString предложения SQL ORDER BY .

Замечания

Набор записей использует эту строку для сортировки записей, которые он выбирает во время Open или Requery вызова. Эту функцию можно использовать для сортировки набора записей по одному или нескольким столбцам. Синтаксис SQL ODBC для ORDER BY предложения

ORDER BY sort-specification [, sort-specification]...

где спецификация сортировки — целое число или имя столбца. Можно также указать порядок возрастания или убывания (порядок по умолчанию возрастает), добавив asC или DESC в список столбцов в строке сортировки. Выбранные записи сначала сортируются по первому столбцу, а затем по второму и т. д. Например, можно заказать набор записей "Клиенты" по фамилии, а затем имя. Количество столбцов, которые можно перечислить, зависит от источника данных. Дополнительные сведения см. в пакете SDK для Windows.

Не включайте ORDER BY ключевое слово в строку. Платформа предоставляет ее.

Дополнительные сведения о предложениях SQL см. в статье SQL. Дополнительные сведения о сортировке записей см. в разделе Recordset: Sorting Records (ODBC).

Пример

CCustomer rsCustSet(&m_dbCust);

// Set the sort string
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");

// Run the sorted query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));

CRecordset::Move

Перемещает текущий указатель записи в наборе записей либо вперед, либо назад.

virtual void Move(
    long nRows,
    WORD wFetchType = SQL_FETCH_RELATIVE);

Параметры

nRows
Количество строк для перемещения вперед или назад. Положительные значения перемещаются вперед к концу набора записей. Отрицательные значения перемещаются назад к началу.

wFetchType
Определяет набор строк, который Move будет получить. Дополнительные сведения см. в разделе "Заметки".

Замечания

Если вы передаете значение 0 для nRows, Move обновляет текущую запись; Move завершит любое текущее AddNew или Edit режимное значение и восстановит значение текущей записи до AddNew или Edit вызова.

Примечание.

При переходе по набору записей нельзя пропустить удаленные записи. Дополнительные сведения см. в разделе CRecordset::IsDeleted. При открытии CRecordsetskipDeletedRecords набора параметров утверждаетnRows, Move равен ли параметр 0. Это поведение предотвращает обновление строк, удаленных другими клиентскими приложениями с использованием одних и того же данных. Дополнительные сведения см. dwOption в Open параметре skipDeletedRecords.

Move перемещает набор записей по наборам строк. На основе значений для nRows и wFetchType, Move извлекает соответствующий набор строк, а затем делает первую запись в этом наборе строк текущей записи. Если вы не реализовали массовое получение строк, размер набора строк всегда равен 1. При получении набора строк напрямую вызывает CheckRowsetError функцию-член для Move обработки любых ошибок, возникающих из-за получения.

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

В следующей таблице перечислены возможные значения для wFetchTypeнабора строк, который Move будет выполняться на основе wFetchType и nRowsлюбой эквивалентной функции-члена, соответствующей wFetchType.

wFetchType Получение набора строк Эквивалентная функция-член
SQL_FETCH_RELATIVE (значение по умолчанию) Набор строк, запускающий nRows строки из первой строки в текущем наборе строк.
SQL_FETCH_NEXT Следующий набор строк; nRows игнорируется. MoveNext
SQL_FETCH_PRIOR Предыдущий набор строк; nRows игнорируется. MovePrev
SQL_FETCH_FIRST Первый набор строк в наборе записей; nRows игнорируется. MoveFirst
SQL_FETCH_LAST Последний полный набор строк в наборе записей; nRows игнорируется. MoveLast
SQL_FETCH_ABSOLUTE Если nRows> значение 0, набор строк запускает nRows строки с начала набора записей. Если nRows< значение 0, набор строк запускает nRows строки из конца набора записей. Если nRows = 0, возвращается условие начала файла (BOF). SetAbsolutePosition
SQL_FETCH_BOOKMARK Набор строк, начинающийся с строки, значение закладки которой nRowsсоответствует. SetBookmark

Примечание.

Для наборов записей Move только для пересылки допустимо только значение SQL_FETCH_NEXT для wFetchType.

Внимание

Вызов Move вызывает исключение, если набор записей не содержит записей. Чтобы определить, имеет ли набор записей какие-либо записи, вызов IsBOF и IsEOF.

Примечание.

Если вы прокрутили после начала или конца набора записей (IsBOF или IsEOF возвращает ненулевое значение), вызов Move функции может вызвать исключение CDBException. Например, если IsEOF возвращает ненулевое значение и IsBOF не выполняется, то MoveNext будет вызываться исключение, но MovePrev не будет.

Примечание.

При вызове Move текущей записи при обновлении или добавлении обновлений обновления будут потеряны без предупреждения.

Дополнительные сведения о навигации по набору записей см. в статьях Recordset: Scrolling (ODBC) и Recordset: Bookmarks and Absolute Positions (ODBC). Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC). Дополнительные сведения см. в функции SQLExtendedFetch API ODBC в пакете SDK для Windows.

Пример

// rs is a CRecordset or a CRecordset-derived object

// Change the rowset size to 5
rs.SetRowsetSize(5);

// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);

// Move to the first record in the recordset
rs.MoveFirst();

// Move to the sixth record
rs.Move(5);
// Other equivalent ways to move to the sixth record:
rs.Move(6, SQL_FETCH_ABSOLUTE);
rs.SetAbsolutePosition(6);
// In this case, the sixth record is the first record in the next rowset,
// so the following are also equivalent:
rs.MoveFirst();
rs.Move(1, SQL_FETCH_NEXT);

rs.MoveFirst();
rs.MoveNext();

CRecordset::MoveFirst

Делает первую запись в первом наборе строк текущей записью.

void MoveFirst();

Замечания

Независимо от того, была ли реализована массовая выборка строк, это всегда будет первой записью в наборе записей.

Вам не нужно MoveFirst вызывать сразу после открытия набора записей. В то время первая запись (при наличии) автоматически является текущей записью.

Примечание.

Эта функция-член не является допустимой для наборов записей только для пересылки.

Примечание.

При переходе по набору записей нельзя пропустить удаленные записи. Дополнительные сведения см. в IsDeleted функции-члене.

Внимание

Вызов любой из Move функций вызывает исключение, если набор записей не содержит записей. Чтобы определить, имеет ли набор записей какие-либо записи, вызов IsBOF и IsEOF.

Примечание.

При вызове любой из функций при обновлении или добавлении текущей Move записи обновления обновления будут потеряны без предупреждения.

Дополнительные сведения о навигации по набору записей см. в статьях Recordset: Scrolling (ODBC) и Recordset: Bookmarks and Absolute Positions (ODBC). Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Пример

Пример см. в примере IsBOF.

CRecordset::MoveLast

Делает первую запись в последнем полном наборе строк текущей записи.

void MoveLast();

Замечания

Если вы не реализовали массовое получение строк, набор записей имеет размер набора строк 1, поэтому MoveLast переходит к последней записи в наборе записей.

Примечание.

Эта функция-член не является допустимой для наборов записей только для пересылки.

Примечание.

При переходе по набору записей нельзя пропустить удаленные записи. Дополнительные сведения см. в IsDeleted функции-члене.

Внимание

Вызов любой из Move функций вызывает исключение, если набор записей не содержит записей. Чтобы определить, имеет ли набор записей какие-либо записи, вызов IsBOF и IsEOF.

Примечание.

При вызове любой из функций при обновлении или добавлении текущей Move записи обновления обновления будут потеряны без предупреждения.

Дополнительные сведения о навигации по набору записей см. в статьях Recordset: Scrolling (ODBC) и Recordset: Bookmarks and Absolute Positions (ODBC). Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Пример

Пример см. в примере IsBOF.

CRecordset::MoveNext

Создает первую запись в следующем наборе строк текущей записи.

void MoveNext();

Замечания

Если вы не реализовали массовое получение строк, набор записей имеет размер набора строк 1, поэтому MoveNext переходит к следующей записи.

Примечание.

При переходе по набору записей нельзя пропустить удаленные записи. Дополнительные сведения см. в IsDeleted функции-члене.

Внимание

Вызов любой из Move функций вызывает исключение, если набор записей не содержит записей. Чтобы определить, имеет ли набор записей какие-либо записи, вызов IsBOF и IsEOF.

Примечание.

Перед вызовом MoveNextрекомендуется также вызватьIsEOF. Например, если вы прокрутили после конца набора записей, IsEOF возвращается ненулевое значение. Последующий вызов MoveNext вызывает исключение.

Примечание.

При вызове любой из функций при обновлении или добавлении текущей Move записи обновления обновления будут потеряны без предупреждения.

Дополнительные сведения о навигации по набору записей см. в статьях Recordset: Scrolling (ODBC) и Recordset: Bookmarks and Absolute Positions (ODBC). Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Пример

Пример см. в примере IsBOF.

CRecordset::MovePrev

Делает первую запись в предыдущем наборе строк текущей записью.

void MovePrev();

Замечания

Если вы не реализовали массовое получение строк, набор записей имеет размер набора строк 1, поэтому MovePrev переходит к предыдущей записи.

Примечание.

Эта функция-член не является допустимой для наборов записей только для пересылки.

Примечание.

При переходе по набору записей нельзя пропустить удаленные записи. Дополнительные сведения см. в IsDeleted функции-члене.

Внимание

Вызов любой из Move функций вызывает исключение, если набор записей не содержит записей. Чтобы определить, имеет ли набор записей какие-либо записи, вызов IsBOF и IsEOF.

Примечание.

Перед вызовом MovePrevрекомендуется также вызватьIsBOF. Например, если вы прокрутили впереди начала набора записей, IsBOF вернется ненулевое значение. Последующий вызов MovePrev вызывает исключение.

Примечание.

При вызове любой из функций при обновлении или добавлении текущей Move записи обновления обновления будут потеряны без предупреждения.

Дополнительные сведения о навигации по набору записей см. в статьях Recordset: Scrolling (ODBC) и Recordset: Bookmarks and Absolute Positions (ODBC). Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Пример

Пример см. в примере IsBOF.

CRecordset::OnSetOptions

Вызывается для задания параметров (используемых при выборе) для указанной инструкции ODBC.

virtual void OnSetOptions(HSTMT hstmt);

Параметры

hstmt
Инструкция HSTMT ODBC, параметры которой необходимо задать.

Замечания

Вызов OnSetOptions для задания параметров (используемых при выборе) для указанной инструкции ODBC. Платформа вызывает эту функцию-член, чтобы задать начальные параметры набора записей. OnSetOptions определяет поддержку источника данных для прокручиваемых курсоров и параллелизма курсоров и задает параметры набора записей соответствующим образом. (В то время как OnSetOptions используется для операций выбора, OnSetUpdateOptions используется для операций обновления.)

Переопределите OnSetOptions параметры, относящиеся к драйверу или источнику данных. Например, если источник данных поддерживает открытие эксклюзивного доступа, вы можете переопределить OnSetOptions , чтобы воспользоваться этой возможностью.

Дополнительные сведения о курсорах см. в статье ODBC.

CRecordset::OnSetUpdateOptions

Вызывается для задания параметров (используемых при обновлении) для указанной инструкции ODBC.

virtual void OnSetUpdateOptions(HSTMT hstmt);

Параметры

hstmt
Инструкция HSTMT ODBC, параметры которой необходимо задать.

Замечания

Вызов OnSetUpdateOptions набора параметров (используемый при обновлении) для указанной инструкции ODBC. Платформа вызывает эту функцию-член после создания HSTMT записей для обновления записей в наборе записей. (В то время как OnSetOptions используется для операций выбора, OnSetUpdateOptions используется для операций обновления.) OnSetUpdateOptions определяет поддержку источника данных для прокручиваемых курсоров и параллелизма курсоров и задает параметры набора записей соответствующим образом.

Переопределите OnSetUpdateOptions , чтобы задать параметры инструкции ODBC перед использованием этой инструкции для доступа к базе данных.

Дополнительные сведения о курсорах см. в статье ODBC.

CRecordset::Open

Открывает набор записей, извлекая таблицу или выполняя запрос, который представляет набор записей.

virtual BOOL Open(
    UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
    LPCTSTR lpszSQL = NULL,
    DWORD dwOptions = none);

Параметры

nOpenType
Примите значение AFX_DB_USE_DEFAULT_TYPEпо умолчанию или используйте одно из следующих значений из enum OpenType:

  • CRecordset::dynaset Набор записей с двунаправленной прокруткой. Открытие набора записей определяет членство и упорядочение записей, но изменения, внесенные другими пользователями в значения данных, видны после операции получения. Dynaset также называются наборами записей на основе набора ключей.

  • CRecordset::snapshot Статический набор записей с двунаправленной прокруткой. Открытие набора записей определяет членство и порядок записей. Получение записи определяет значения данных. Изменения, внесенные другими пользователями, не отображаются до закрытия набора записей и повторного открытия.

  • CRecordset::dynamic Набор записей с двунаправленной прокруткой. Изменения, внесенные другими пользователями в членства, упорядочивание и значения данных, видны после операции получения. Многие драйверы ODBC не поддерживают этот тип набора записей.

  • CRecordset::forwardOnly Набор записей только для чтения с только пересылкой прокрутки.

    Для CRecordsetпараметра по умолчанию используется CRecordset::snapshotзначение . Механизм значения по умолчанию позволяет мастерам Visual C++ взаимодействовать как с ODBC CRecordset , так и с DAO CDaoRecordset, которые имеют разные значения по умолчанию.

Дополнительные сведения об этих типах наборов записей см. в разделе Recordset (ODBC). Дополнительные сведения см. в разделе "Использование блочных и прокручиваемых курсоров" в пакете SDK для Windows.

Внимание

Если запрошенный тип не поддерживается, платформа создает исключение.

lpszSQL
Указатель строки, содержащий один из следующих элементов:

  • NULL Указатель.

  • Имя таблицы.

  • Инструкция SQL (необязательно с sql SELECTWHERE или ORDER BY предложением).

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

Дополнительные сведения об этой строке см. в таблице и обсуждении роли ClassWizard в разделе "Примечания ".

Примечание.

Порядок столбцов в результирующем наборе должен соответствовать порядку вызовов функции RFX или Bulk RFX в DoFieldExchange переопределении функции или DoBulkFieldExchange функции.

dwOptions
Битовая маска, которая может указать сочетание значений, перечисленных ниже. Некоторые из них являются взаимоисключающими. Значение по умолчанию: none.

  • CRecordset::none Параметры не заданы. Это значение параметра является взаимоисключающим со всеми другими значениями. По умолчанию набор записей можно обновить с Edit помощью или Delete разрешить добавление новых записей.AddNew Updatability зависит от источника данных и указанного nOpenType параметра. Оптимизация массовых добавлений недоступна. Массовое получение строк не будет реализовано. Удаленные записи не пропускаются во время навигации набора записей. Закладки недоступны. Реализовано автоматическое грязное поле проверка.

  • CRecordset::appendOnly Не разрешайте или не разрешайте Edit набор Delete записей. Разрешить AddNew только. Этот параметр является взаимоисключающим с CRecordset::readOnly.

  • CRecordset::readOnly Откройте набор записей только для чтения. Этот параметр является взаимоисключающим с CRecordset::appendOnly.

  • CRecordset::optimizeBulkAdd Используйте подготовленную инструкцию SQL для оптимизации одновременного добавления множества записей. Применяется только в том случае, если вы не используете функцию SQLSetPos API ODBC для обновления набора записей. Первое обновление определяет, какие поля помечены грязное. Этот параметр является взаимоисключающим с CRecordset::useMultiRowFetch.

  • CRecordset::useMultiRowFetch Реализуйте массовое получение строк, чтобы разрешить получение нескольких строк в одной операции получения. Это расширенная функция, предназначенная для повышения производительности; Однако обмен полями массовой записи не поддерживается ClassWizard. Этот параметр является взаимоисключающим с CRecordset::optimizeBulkAdd. Если указано CRecordset::useMultiRowFetch, CRecordset::noDirtyFieldCheck параметр будет включен автоматически (двойной буферизация не будет доступен); в наборах записей только для пересылки параметр CRecordset::useExtendedFetch будет включен автоматически. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

  • CRecordset::skipDeletedRecords Пропустить все удаленные записи при переходе по набору записей. Это приведет к замедлению производительности в определенных относительных выборках. Этот параметр недействителен для наборов записей только для пересылки. Если вы вызываете Move параметр nRows с значением 0, а CRecordset::skipDeletedRecords набор Move параметров будет утверждать. CRecordset::skipDeletedRecords аналогичен упаковке драйверов, что означает, что удаленные строки удаляются из набора записей. Однако если ваши пакеты драйверов записывают записи, они будут пропускать только те записи, которые вы удаляете; он не пропустит записи, удаленные другими пользователями, пока набор записей открыт. CRecordset::skipDeletedRecords пропускает строки, удаленные другими пользователями.

  • CRecordset::useBookmarks При наличии поддержки можно использовать закладки в наборе записей. Закладки медленно извлекает данные, но повышают производительность навигации по данным. Недопустимый для наборов записей только для пересылки. Дополнительные сведения см. в разделе Recordset: Закладки и абсолютные позиции (ODBC).

  • CRecordset::noDirtyFieldCheckОтключите автоматическое грязное поле проверка (двойное буферизация). Это повысит производительность; однако необходимо вручную пометить поля как грязное путем вызова SetFieldDirty функций-членов и SetFieldNull функций-членов. Двойное буферизация в классе CRecordset аналогично двойному буферизации в классе CDaoRecordset. Однако в CRecordsetней нельзя включить двойное буферизация отдельных полей; вы можете включить его для всех полей или отключить его для всех полей. Если вы укажете этот параметр CRecordset::useMultiRowFetch, CRecordset::noDirtyFieldCheck то включается автоматически. SetFieldDirty Однако его SetFieldNull нельзя использовать для наборов записей, реализующих массовое получение строк.

  • CRecordset::executeDirect Не используйте подготовленную инструкцию SQL. Для повышения производительности укажите этот параметр, если Requery функция-член никогда не будет вызываться.

  • CRecordset::useExtendedFetch Реализуйте SQLExtendedFetch вместо SQLFetch. Это предназначено для реализации массового получения строк в наборах записей только для пересылки. Если указать параметр CRecordset::useMultiRowFetch в наборе записей только для пересылки, CRecordset::useExtendedFetch будет включен автоматически.

  • CRecordset::userAllocMultiRowBuffers Пользователь выделяет буферы хранилища для данных. Используйте этот параметр, CRecordset::useMultiRowFetch если вы хотите выделить собственное хранилище. В противном случае платформа автоматически выделяет необходимое хранилище. Дополнительные сведения см. в разделе Recordset: извлечение записей в пакетной службе (ODBC). Указание CRecordset::userAllocMultiRowBuffers без указания CRecordset::useMultiRowFetch результатов в неудачном утверждении.

Возвращаемое значение

Ненулевое CRecordset значение, если объект был успешно открыт; в противном случае значение 0 , если CDatabase::Open (если вызывается) возвращает значение 0.

Замечания

Для выполнения запроса, определенного набором записей, необходимо вызвать эту функцию-член. Перед вызовом Openнеобходимо создать объект набора записей.

Подключение этого набора записей к источнику данных зависит от способа создания набора записей перед вызовом Open. Если передать CDatabase объект конструктору набора записей, который не был подключен к источнику данных, эта функция-член используется GetDefaultConnect для попытки открыть объект базы данных. При передаче NULL в конструктор наборов записей конструктор конструктор создает CDatabase объект для вас и Open пытается подключить объект базы данных. Дополнительные сведения о закрытии набора записей и подключении в этих различных обстоятельствах см. в разделе Close.

Примечание.

Доступ к источнику данных через CRecordset объект всегда предоставляется совместно. CDaoRecordset В отличие от класса, нельзя использовать CRecordset объект для открытия источника данных с эксклюзивным доступом.

При вызове Openзапрос, как правило, инструкция SQL SELECT выбирает записи на основе условий, показанных в следующей таблице.

Значение параметра lpszSQL Выбранные записи определяются Пример
NULL Строка, возвращаемая GetDefaultSQL.
Имя таблицы SQL Все столбцы списка таблиц или DoFieldExchangeDoBulkFieldExchange. "Customer"
Предопределенное имя запроса (хранимая процедура) Столбцы, возвращаемые запросом. "{call OverDueAccts}"
SELECT Список таблиц со списком FROM столбцов Указанные столбцы из указанных таблиц. "SELECT CustId, CustName FROM

Customer"

Внимание

Не вставляйте дополнительное пробелы в строку SQL. Например, при вставке пробелов между фигурной скобкой и CALL ключевое слово MFC неправильно интерпретирует строку SQL как имя таблицы и включает ее в SELECT инструкцию, что приведет к возникновению исключения. Аналогичным образом, если предопределенный запрос использует выходной параметр, не вставляйте пробелы между фигурной скобкой и символом "". Наконец, не следует вставлять пробелы перед фигурной скобкой CALL в инструкции или перед SELECT ключевое слово в инструкцииSELECT.

Обычной процедурой является передача NULLOpenв ; в этом случае Open вызывает GetDefaultSQL. Если вы используете производный CRecordset класс, укажите имена таблиц, GetDefaultSQL указанные в ClassWizard. Вместо этого можно указать другие сведения в параметре lpszSQL .

Независимо от того, что вы передаете, Open создает окончательную строку SQL для запроса (строка может содержать WHERE sql и ORDER BY предложения, добавленные к lpszSQL переданной строке), а затем выполняет запрос. Вы можете проверить созданную строку, вызвав GetSQL после вызова Open. Дополнительные сведения о том, как набор записей создает инструкцию SQL и выбирает записи, см. в разделе Recordset: How Recordsets Select Records (ODBC).

Элементы данных поля класса наборов записей привязаны к столбцам выбранных данных. Если возвращаются какие-либо записи, первая запись становится текущей.

Если вы хотите задать параметры набора записей, например фильтр или сортировку, укажите их после создания объекта набора записей, но перед вызовом Open. Если вы хотите обновить записи в наборе записей после открытия набора записей, вызовите вызов Requery.

Дополнительные сведения, включая дополнительные примеры, см. в разделе Recordset (ODBC),Recordset: How Recordsets Select Records (ODBC), and Recordset: Создание и закрытие наборов записей (ODBC).

Пример

В следующих примерах кода показаны различные формы Open вызова.

// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived 
// objects

// Open rs using the default SQL statement, implement bookmarks, and turn 
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks |
   CRecordset::noDirtyFieldCheck);

// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));

// Accept all defaults
rsDefault.Open();

CRecordset::RefreshRowset

Обновления данные и состояние строки в текущем наборе строк.

void RefreshRowset(
    WORD wRow,
    WORD wLockType = SQL_LOCK_NO_CHANGE);

Параметры

wRow
Одноуровневая позиция строки в текущем наборе строк. Это значение может варьироваться от нуля до размера набора строк.

wLockType
Значение, указывающее, как заблокировать строку после обновления. Дополнительные сведения см. в разделе "Заметки".

Замечания

Если значение равно нулю wRow, то будет обновлена каждая строка в наборе строк.

Чтобы использовать RefreshRowset, необходимо реализовать массовое получение строк, указав CRecordset::useMulitRowFetch параметр в Open функции-члене.

RefreshRowset вызывает функцию SQLSetPosAPI ODBC. Параметр wLockType указывает состояние блокировки строки после SQLSetPos выполнения. В следующей таблице описываются возможные значения wLockType.

wLockType Description
SQL_LOCK_NO_CHANGE (значение по умолчанию) Драйвер или источник данных гарантирует, что строка находится в том же заблокированном или разблокированном состоянии, что и раньше RefreshRowset .
SQL_LOCK_EXCLUSIVE Драйвер или источник данных блокирует строку исключительно. Не все источники данных поддерживают этот тип блокировки.
SQL_LOCK_UNLOCK Драйвер или источник данных разблокирует строку. Не все источники данных поддерживают этот тип блокировки.

Дополнительные сведения см SQLSetPos. в пакете SDK для Windows. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

CRecordset::Requery

Перестраивает (обновляет) набор записей.

virtual BOOL Requery();

Возвращаемое значение

Ненулевое значение, если набор записей был успешно перестроен; в противном случае — 0.

Замечания

Если возвращаются какие-либо записи, первая запись становится текущей.

Чтобы набор записей отражал дополнения и удаления, которые вы или другие пользователи вносят в источник данных, необходимо перестроить набор записей путем вызова Requery. Если набор записей является dynaset, он автоматически отражает обновления, которые вы или другие пользователи вносят в существующие записи (но не дополнения). Если набор записей является моментальным снимком, необходимо вызвать Requery изменение другими пользователями и дополнениями и удалениями.

Для dynaset или моментального снимка вызовите Requery в любое время, когда вы хотите перестроить набор записей с помощью нового фильтра или сортировки или новых значений параметров. Задайте новое свойство фильтра или сортировки, назначив новые значения m_strFilterm_strSort и перед вызовом Requery. Задайте новые параметры, назначив новые значения членам данных параметров перед вызовом Requery. Если строки фильтра и сортировки не изменяются, можно повторно использовать запрос, что повышает производительность.

Если попытка перестроить набор записей завершается ошибкой, набор записей закрывается. Перед вызовом Requeryвы можете определить, можно ли повторно получить набор записей, вызвав CanRestart функцию-член. CanRestart не гарантирует, что Requery будет выполнено успешно.

Внимание

Вызовите Requery только после вызова Open.

Пример

В этом примере выполняется перестроение набора записей для применения другого порядка сортировки.

CCustomer rsCustSet(&m_dbCust);

// Open the recordset
rsCustSet.Open();

// Use the recordset ...

// Set the sort order and Requery the recordset
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
if (!rsCustSet.CanRestart())
return;    // Unable to requery

if (!rsCustSet.Requery())
// Requery failed, so take action
AfxMessageBox(_T("Requery failed!"));

CRecordset::SetAbsolutePosition

Помещает набор записей в запись, соответствующую указанному номеру записи.

void SetAbsolutePosition(long nRows);

Параметры

nRows
Одноуровневая порядковая позиция текущей записи в наборе записей.

Замечания

SetAbsolutePosition перемещает текущий указатель записи на основе этой порядковой позиции.

Примечание.

Эта функция-член не допустима в наборах записей только для пересылки.

Для наборов записей ODBC абсолютный параметр позиции 1 относится к первой записи в наборе записей; Параметр 0 ссылается на позицию начала файла (BOF).

Вы также можете передать отрицательные значения SetAbsolutePositionв . В этом случае позиция набора записей оценивается с конца набора записей. Например, SetAbsolutePosition( -1 ) перемещает текущий указатель на последнюю запись в наборе записей.

Примечание.

Абсолютная позиция не предназначена для использования в качестве суррогатного номера записи. Закладки по-прежнему являются рекомендуемым способом сохранения и возврата к заданной позиции, так как позиция записи изменяется при удалении предыдущих записей. Кроме того, вы не можете быть уверены, что данная запись будет иметь ту же абсолютную позицию, если набор записей создается повторно, так как порядок отдельных записей в наборе записей не гарантируется, если только он не создан с помощью инструкции SQL с помощью ORDER BY предложения.

Дополнительные сведения о навигации по набору записей и закладках см. в статьях Recordset: Scrolling (ODBC) и Recordset: Bookmarks and Absolute Positions (ODBC).

CRecordset::SetBookmark

Помещает набор записей в запись, содержащую указанную закладку.

void SetBookmark(const CDBVariant& varBookmark);

Параметры

varBookmark
Ссылка на CDBVariant объект, содержащий значение закладки для определенной записи.

Замечания

Чтобы определить, поддерживаются ли закладки в наборе записей, вызовите CanBookmark. Чтобы сделать закладки доступными, если они поддерживаются, необходимо задать CRecordset::useBookmarks параметр в dwOptions параметре Open функции-члена.

Примечание.

Если закладки не поддерживаются или недоступны, вызов SetBookmark приведет к возникновению исключения. Закладки не поддерживаются в наборах записей только для пересылки.

Чтобы сначала получить закладку для текущей записи, вызов GetBookmark, который сохраняет значение закладки в CDBVariant объект. Позже вы можете вернуться к этой записи, вызвав SetBookmark сохраненные значения закладки.

Примечание.

После определенных операций набора записей перед вызовом SetBookmarkследует проверка сохраняемость закладки. Например, если вы извлекаете закладку с GetBookmark помощью вызова, Requeryзакладка может перестать быть допустимой. Вызовите CDatabase::GetBookmarkPersistence проверка, можно ли безопасно вызватьSetBookmark.

Дополнительные сведения о навигации по закладкам и наборам записей см. в статьях Recordset: Bookmarks and Absolute Positions (ODBC) и Recordset: Scrolling (ODBC).

CRecordset::SetFieldDirty

Помечает элемент данных поля набора записей как измененный или без изменений.

void SetFieldDirty(void* pv, BOOL bDirty = TRUE);

Параметры

pv
Содержит адрес элемента данных поля в наборе записей или NULL. Если NULLвсе элементы данных поля в наборе записей помечены. (C++ NULL не совпадает с значением NULL в терминологии базы данных, что означает "отсутствие значения".)

bDirty
TRUEЗначение , если элемент данных поля должен быть помечен как "грязное" (изменен). В противном случае FALSE , если элемент данных поля должен быть помечен как "чистый" (без изменений).

Замечания

Пометка полей без изменений гарантирует, что поле не обновляется и приводит к снижению трафика SQL.

Примечание.

Эта функция-член не применима к наборам записей, использующим массовое получение строк. Если вы реализовали массовое получение строк, произойдет SetFieldDirty сбой утверждения. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Платформа помечает измененные элементы данных поля, чтобы убедиться, что они будут записаны в запись в источнике данных механизмом обмена полями записей (RFX). Изменение значения поля обычно задает грязное поля автоматически, поэтому вам редко нужно вызывать SetFieldDirty себя, но иногда требуется убедиться, что столбцы будут явно обновлены или вставлены независимо от значения элемента данных поля.

Внимание

Вызовите эту функцию-член только после вызова Edit или AddNew.

Использование NULL первого аргумента функции будет применять функцию только к полям, а не param к outputColumn полям. Например, вызов

SetFieldNull(NULL);

значение <>NULL/>, если задано значение только outputColumn полей; param поля не будут затронуты.

Для работы с param полями необходимо указать фактический адрес человека param , над которым вы хотите работать, например:

SetFieldNull(&m_strParam);

Это означает, что вы не можете задать для всех param полей NULLзначение , так как можно использовать outputColumn поля.

CRecordset::SetFieldNull

Помечает элемент данных поля набора записей как null (в частности, не имеет значения) или не имеет значения NULL.

void SetFieldNull(void* pv, BOOL bNull = TRUE);

Параметры

pv
Содержит адрес элемента данных поля в наборе записей или NULL. Если NULLвсе элементы данных поля в наборе записей помечены. (C++ NULL не совпадает с значением NULL в терминологии базы данных, что означает "отсутствие значения".)

bNull
Ненулевое значение, если элемент данных поля должен быть помечен как не имеющий значения (NULL). В противном случае значение 0, если элемент данных поля должен быть помечен как не null.

Замечания

При добавлении новой записи в набор записей все элементы данных поля изначально задают значение NULL и помечены как "грязное" (изменено). При получении записи из источника данных его столбцы уже имеют значения или имеют значение NULL.

Примечание.

Не вызывайте эту функцию-член для наборов записей, использующих массовое получение строк. Если вы реализовали массовое получение строк, вызов SetFieldNull приводит к сбою утверждения. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Если вы конкретно хотите назначить поле текущей записи как не имеющее значения, вызов SetFieldNull с bNull установленным значением, чтобы TRUE пометить его как NULL. Если поле было ранее отмечено null, и теперь вы хотите дать ему значение, задайте его новое значение. Вам не нужно удалять флаг NULL с SetFieldNull. Чтобы определить, разрешено ли поле иметь значение NULL, вызовите .IsFieldNullable

Внимание

Вызовите эту функцию-член только после вызова Edit или AddNew.

Использование NULL первого аргумента функции будет применять функцию только к полям, а не param к outputColumn полям. Например, вызов

SetFieldNull(NULL);

значение <>NULL/>, если задано значение только outputColumn полей; param поля не будут затронуты.

Для работы с param полями необходимо указать фактический адрес человека param , над которым вы хотите работать, например:

SetFieldNull(&m_strParam);

Это означает, что вы не можете задать для всех param полей NULLзначение , так как можно использовать outputColumn поля.

Примечание.

При задании параметров null вызов SetFieldNull перед открытием набора записей приводит к утверждению. В этом случае вызовите SetParamNull.

SetFieldNull реализуется через DoFieldExchange.

CRecordset::SetLockingMode

Задает режим блокировки на "оптимистичный" блокировку (по умолчанию) или "пессимистичную" блокировку. Определяет, как записи заблокированы для обновлений.

void SetLockingMode(UINT nMode);

Параметры

nMode
Содержит одно из следующих значений из enum LockMode:

  • optimistic Оптимистическая блокировка блокирует запись, обновляемую только во время вызова Update.

  • pessimistic Пессимистичная блокировка блокирует запись сразу Edit после вызова и сохраняет ее заблокированной до Update завершения вызова или перехода к новой записи.

Замечания

Вызовите эту функцию-член, если необходимо указать, какая из двух стратегий блокировки записей используется для обновлений. По умолчанию используется optimisticрежим блокировки набора записей. Вы можете изменить это на более осторожной pessimistic стратегии блокировки. Вызовите SetLockingMode после создания и открытия объекта набора записей, но перед вызовом Edit.

CRecordset::SetParamNull

Помечает параметр как NULL (в частности, не имеет значения) или не имеет значения NULL.

void SetParamNull(
    int nIndex,
    BOOL bNull = TRUE);

Параметры

nIndex
Отсчитываемый с нуля индекс параметра.

bNull
Если TRUE (значение по умолчанию), параметр помечается как NULL. В противном случае параметр помечается как непустой.

Замечания

В отличие от SetFieldNullэтого, можно вызвать SetParamNull перед открытием набора записей.

SetParamNull обычно используется с предопределенными запросами (хранимыми процедурами).

CRecordset::SetRowsetCursorPosition

Перемещает курсор в строку в текущем наборе строк.

void SetRowsetCursorPosition(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);

Параметры

wRow
Одноуровневая позиция строки в текущем наборе строк. Это значение может быть от 1 до размера набора строк.

wLockType
Значение, указывающее, как заблокировать строку после обновления. Дополнительные сведения см. в разделе "Заметки".

Замечания

При реализации массового получения строк записи извлекаются наборами строк, где первая запись в наборе строк является текущей записью. Чтобы сделать другую запись в наборе строк текущей записи, вызовите SetRowsetCursorPosition. Например, можно объединить SetRowsetCursorPosition функцию-член GetFieldValue , чтобы динамически извлекать данные из любой записи набора записей.

Чтобы использовать SetRowsetCursorPosition, необходимо реализовать массовое получение строк, указав CRecordset::useMultiRowFetch параметр dwOptions параметра в функции-члене Open .

SetRowsetCursorPosition вызывает функцию SQLSetPosAPI ODBC. Параметр wLockType указывает состояние блокировки строки после SQLSetPos выполнения. В следующей таблице описываются возможные значения wLockType.

wLockType Description
SQL_LOCK_NO_CHANGE (значение по умолчанию) Драйвер или источник данных гарантирует, что строка находится в том же заблокированном или разблокированном состоянии, что и раньше SetRowsetCursorPosition .
SQL_LOCK_EXCLUSIVE Драйвер или источник данных блокирует строку исключительно. Не все источники данных поддерживают этот тип блокировки.
SQL_LOCK_UNLOCK Драйвер или источник данных разблокирует строку. Не все источники данных поддерживают этот тип блокировки.

Дополнительные сведения см SQLSetPos. в пакете SDK для Windows. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

CRecordset::SetRowsetSize

Указывает количество записей, которые требуется получить во время получения.

virtual void SetRowsetSize(DWORD dwNewRowsetSize);

Параметры

dwNewRowsetSize
Количество строк, извлекаемых во время заданного получения.

Замечания

Эта функция-член виртуального члена указывает, сколько строк, которые требуется получить во время единого получения при использовании массового извлечения строк. Чтобы реализовать массовое получение строк, необходимо задать CRecordset::useMultiRowFetch параметр в dwOptions параметре Open функции-члена.

Примечание.

Вызов SetRowsetSize без реализации массового получения строк приведет к сбою утверждения.

Вызов перед вызовом SetRowsetSizeOpen , чтобы первоначально задать размер набора строк для набора записей. Размер набора строк по умолчанию при реализации массового получения строк составляет 25.

Примечание.

При вызове SetRowsetSizeиспользуйте осторожность. Если вы вручную выделяете хранилище для данных (как указано CRecordset::userAllocMultiRowBuffers параметром параметра dwOptions вOpen), необходимо проверка, необходимо ли перераспределить эти буферы хранилища после вызоваSetRowsetSize, но перед выполнением любой операции навигации курсора.

Чтобы получить текущий параметр для размера набора строк, вызовите .GetRowsetSize

Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

CRecordset::Update

Выполняет AddNew или Edit выполняет операцию, сохраняя новые или измененные данные в источнике данных.

virtual BOOL Update();

Возвращаемое значение

Ненулевое значение, если одна запись была успешно обновлена; в противном случае значение 0, если столбцы не изменились. Если записи не были обновлены, или если было обновлено несколько записей, создается исключение. Исключение также возникает для любого другого сбоя в источнике данных.

Замечания

Вызовите эту функцию-член после вызова AddNew функции-члена или Edit члена. Этот вызов необходим для выполнения AddNew операции или Edit выполнения операции.

Примечание.

Если вы реализовали массовое получение строк, вы не можете вызвать Update. Это приведет к сбою утверждения. Хотя класс CRecordset не предоставляет механизм обновления массовых строк данных, вы можете написать собственные функции с помощью функции SQLSetPosAPI ODBC. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).

Оба AddNewEdit файла и подготовка буфера редактирования, в котором добавленные или измененные данные помещаются для сохранения в источник данных. Update сохраняет данные. Обновляются только эти поля, помеченные или обнаруженные как измененные.

Если источник данных поддерживает транзакции, можно вызвать Update (и соответствующую AddNew или Edit вызвать) часть транзакции. Дополнительные сведения о транзакциях см. в разделе "Транзакция( ODBC)".

Внимание

При вызове без первого вызова UpdateAddNew или EditUpdate вызывается CDBExceptionисключение. При вызове AddNew или Editвызове необходимо вызвать Update перед вызовом Move операции или перед закрытием набора записей или подключения к источнику данных. В противном случае изменения будут потеряны без уведомления.

Дополнительные сведения об обработке Update сбоев см. в разделе Recordset: How Recordsets Update Records (ODBC).

Пример

см. транзакцию : выполнение транзакции в наборе записей (ODBC).

См. также

Класс CObject
Диаграмма иерархии
Класс CDatabase
Класс CRecordView