Класс 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 Connectivity (ODBC), используйте вместо него класс CDaoRecordset
. Дополнительные сведения см. в разделе "Обзор: программирование баз данных".
Для работы с набором записей любого типа обычно наследуется класс набора записей для конкретного приложения.CRecordset
Наборы записей выбирают записи из источника данных, а затем:
Прокрутите записи.
Обновите записи и укажите режим блокировки.
Отфильтруйте набор записей, чтобы ограничить, какие записи выбираются из доступных в источнике данных.
Сортировка набора записей.
Параметризируйте набор записей, чтобы настроить его выбор с информацией, неизвестной до времени выполнения.
Чтобы использовать класс, откройте базу данных и создайте объект набора записей, передавая конструктор указатель на CDatabase
объект. Затем вызовите функцию-член набора Open
записей, где можно указать, является ли объект dynaset или моментальным снимком. Вызов Open
выбирает данные из источника данных. После открытия объекта набора записей используйте его функции-члены и члены данных, чтобы прокручивать записи и работать с ними. Доступные операции зависят от того, является ли объект набором данных или моментальным снимком, независимо от того, является ли он обновляемым или доступным только для чтения (это зависит от возможности источника данных Open Database Connectivity (ODBC) и того, реализована ли массовая выборка строк. Чтобы обновить записи, которые могли быть изменены или добавлены с момента Open
вызова, вызовите функцию-член объекта Requery
. Вызовите функцию-член объекта Close
и уничтожите объект после завершения работы с ним.
В производном CRecordset
классе обмен полями записей (RFX) или обмен полями массовой записи (Bulk RFX) используется для поддержки чтения и обновления полей записи.
Дополнительные сведения о наборах записей и обмене полями записей см. в статьях :Программирование баз данных, набор записей (ODBC), набор записей: получение записей в массовой части (ODBC) и Exchange полей записей (RFX). Сведения о dynasets и моментальных снимках см. в статьях Dynaset и Snapshot.
Иерархия наследования
CRecordset
Требования
Заголовок: afxdb.h
CRecordset::AddNew
Готовится к добавлению новой записи в таблицу.
virtual void AddNew();
Замечания
Чтобы увидеть только что добавленную запись, необходимо вызвать функцию-член Requery
. Поля записи изначально имеют значение NULL. (В терминологии базы данных null означает "отсутствие значения" и не совпадает со значением NULL в C++.) Чтобы завершить операцию, необходимо вызвать Update
функцию-член. Update
сохраняет изменения в источнике данных.
Примечание.
Если вы реализовали массовое получение строк, вы не можете вызвать AddNew
. Это приведет к сбою утверждения. Хотя класс CRecordset
не предоставляет механизм обновления массовых строк данных, вы можете написать собственные функции с помощью функции SQLSetPos
API 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
параметра dwOptions
Open
функции-члена. CanBookmark
указывает, поддерживает ли указанный драйвер ODBC и тип курсора закладки. CRecordset::useBookmarks
указывает, будут ли доступны закладки, если они поддерживаются.
Примечание.
Закладки не поддерживаются в наборах записей только для пересылки.
Дополнительные сведения о навигации по закладкам и наборам записей см. в статьях Recordset: Bookmarks and Absolute Positions (ODBC) и Recordset: Scrolling (ODBC).
CRecordset::Cancel
Запросы, что источник данных отменяет асинхронную операцию или процесс из второго потока.
void Cancel();
Замечания
Классы ODBC MFC больше не используют асинхронную обработку; для выполнения асинхронной операции необходимо напрямую вызвать функцию SQLSetConnectOption
API ODBC. Дополнительные сведения см. в разделе "Асинхронное выполнение функций" в руководстве программиста пакета SDK ODBC.
CRecordset::CancelUpdate
Отменяет все ожидающие обновления, вызванные или AddNew
операцией, перед Update
вызовомEdit
.
void CancelUpdate();
Замечания
Примечание.
Эта функция-член не применима к наборам записей, использующим массовое получение строк, так как такие наборы записей не могут вызывать Edit
AddNew
или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
вызывается автоматически в операции навигации курсора, например Open
Requery
, или любой Move
операции. Он передает возвращаемое значение функции SQLExtendedFetch
API 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
После вызова можно снова вызвать Open
Close
. Это позволяет повторно использовать объект набора записей. Альтернативой является вызов 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
не NULL
CDatabase
была вызвана для подключения к источнику данных, набор записей пытается открыть его для вас во время собственного 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
не предоставляет механизм обновления массовых строк данных, вы можете написать собственные функции с помощью функции SQLSetPos
API 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
, Edit
Delete
или Update
передавать изменения обратно в источник данных. В настоящее время класс CRecordset
не предоставляет механизм обновления массовых строк данных. Однако вы можете написать собственные функции с помощью функции SQLSetPos
API 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
не предоставляет механизм обновления массовых строк данных, вы можете написать собственные функции с помощью функции SQLSetPos
API ODBC. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).
Edit
сохраняет значения элементов данных набора записей. При вызове Edit
Edit
внесите изменения, вызовите снова, значения записи восстанавливаются до первого 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
вызывает функцию SQLMoreResults
API 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
используется для получения сведений о таблицах и столбцах. Возможно, вам удобно использовать это подключение по умолчанию при разработке приложения. Но подключение по умолчанию может не соответствовать пользователям приложения. Если это так, следует повторно выполнить эту функцию, отменив 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
вызывает функцию SQLGetData
API 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();
Примечание.
В отличие от класса CDaoRecordset
DAO, 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);
значение 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
записывает эту инициализацию при его использовании для объявления класса наборов записей. Вы также можете написать его вручную.
Платформа использует это число для управления взаимодействием между элементами данных поля и соответствующими столбцами текущей записи в источнике данных.
Внимание
Это число должно соответствовать количеству "выходных столбцов", зарегистрированных или DoFieldExchange
DoBulkFieldExchange
после вызова SetFieldType
с параметром CFieldExchange::outputColumn
.
Столбцы можно привязать динамически, как описано в статье "Набор записей: динамически привязка столбцов данных". При этом необходимо увеличить количество m_nFields
вызовов функции RFX или Bulk RFX в функции-члене DoFieldExchange
DoBulkFieldExchange
для динамически привязанных столбцов.
Дополнительные сведения см. в статьях Recordset: динамически привязка столбцов данных (ODBC) и набора записей: получение записей в массовой части (ODBC).
Пример
см. раздел "Обмен полями записей": использование RFX.
CRecordset::m_nParams
Содержит число элементов данных параметров в классе наборов записей; То есть количество параметров, переданных запросом набора записей.
Замечания
Если в классе наборов записей есть элементы данных параметров, конструктор класса должен инициализировать m_nParams
с правильным числом. Значение m_nParams
по умолчанию равно 0. При добавлении элементов данных параметров (которые необходимо сделать вручную) необходимо также вручную добавить инициализацию в конструктор класса, чтобы отразить количество параметров (которое должно быть не менее большим, чем число заполнителей в вашей m_strFilter
или m_strSort
строке).
Платформа использует это число при параметризации запроса набора записей.
Внимание
Это число должно соответствовать числу "params", зарегистрированному в DoFieldExchange
или после вызова SetFieldType
со значением CFieldExchange::inputParam
параметра , CFieldExchange::outputParam
CFieldExchange::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
. При открытии CRecordset
skipDeletedRecords
набора параметров утверждает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++ взаимодействовать как с ODBCCRecordset
, так и с DAOCDaoRecordset
, которые имеют разные значения по умолчанию.
Дополнительные сведения об этих типах наборов записей см. в разделе Recordset (ODBC). Дополнительные сведения см. в разделе "Использование блочных и прокручиваемых курсоров" в пакете SDK для Windows.
Внимание
Если запрошенный тип не поддерживается, платформа создает исключение.
lpszSQL
Указатель строки, содержащий один из следующих элементов:
NULL
Указатель.Имя таблицы.
Инструкция SQL (необязательно с sql
SELECT
WHERE
или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 | Все столбцы списка таблиц или DoFieldExchange DoBulkFieldExchange . |
"Customer" |
Предопределенное имя запроса (хранимая процедура) | Столбцы, возвращаемые запросом. | "{call OverDueAccts}" |
SELECT Список таблиц со списком FROM столбцов |
Указанные столбцы из указанных таблиц. | "SELECT CustId, CustName FROM Customer" |
Внимание
Не вставляйте дополнительное пробелы в строку SQL. Например, если вставить пробелы между фигурной скобкой и CALL
ключевым словом, MFC неправильно интерпретирует строку SQL как имя таблицы и включает ее в SELECT
инструкцию, что приведет к возникновению исключения. Аналогичным образом, если предопределенный запрос использует выходной параметр, не вставляйте пробелы между фигурной скобкой и символом "". Наконец, необходимо не вставлять пробелы перед фигурной скобкой в операторе CALL
или перед SELECT
ключевым словом в инструкции SELECT
.
Обычной процедурой является передача NULL
Open
в ; в этом случае 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
вызывает функцию SQLSetPos
API 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_strFilter
m_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
себя, но иногда требуется убедиться, что столбцы будут явно обновлены или вставлены независимо от того, какое значение находится в элементе данных поля.
Использование NULL
первого аргумента функции будет применять функцию только к полям, а не param
к outputColumn
полям. Например, вызов
SetFieldNull(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
Использование NULL
первого аргумента функции будет применять функцию только к полям, а не param
к outputColumn
полям. Например, вызов
SetFieldNull(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
вызывает функцию SQLSetPos
API 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
без реализации массового получения строк приведет к сбою утверждения.
Вызов перед вызовом SetRowsetSize
Open
, чтобы первоначально задать размер набора строк для набора записей. Размер набора строк по умолчанию при реализации массового получения строк составляет 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
не предоставляет механизм обновления массовых строк данных, вы можете написать собственные функции с помощью функции SQLSetPos
API ODBC. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).
Оба AddNew
Edit
файла и подготовка буфера редактирования, в котором добавленные или измененные данные помещаются для сохранения в источник данных. Update
сохраняет данные. Обновляются только эти поля, помеченные или обнаруженные как измененные.
Если источник данных поддерживает транзакции, можно вызвать Update
(и соответствующую AddNew
или Edit
вызвать) часть транзакции. Дополнительные сведения о транзакциях см. в разделе "Транзакция( ODBC)".
Внимание
При вызове без первого вызова Update
AddNew
или Edit
Update
вызывается CDBException
исключение. При вызове AddNew
или Edit
вызове необходимо вызвать Update
перед вызовом Move
операции или перед закрытием набора записей или подключения к источнику данных. В противном случае изменения будут потеряны без уведомления.
Дополнительные сведения об обработке Update
сбоев см. в разделе Recordset: How Recordsets Update Records (ODBC).
Пример
см. транзакцию : выполнение транзакции в наборе записей (ODBC).
См. также
Класс CObject
Диаграмма иерархии
Класс CDatabase
Класс CRecordView