Наборы записей. Принципы работы функций AddNew, Edit и Delete (ODBC)
Этот раздел относится к классам ODBC библиотеки MFC.
В этом разделе объясняется, как AddNew
работают функции класса CRecordset
и Edit
Delete
члены. В книге рассматриваются такие темы:
Примечание.
Этот раздел относится к объектам, производным от CRecordset
, в которых пакетное получение строк не реализовано. Если вы используете массовое получение строк, ознакомьтесь с набором записей: извлечение записей в пакетной службе (ODBC).
В качестве дополнения может потребоваться прочитать поле записи Exchange: как работает RFX, который описывает соответствующую роль RFX в операциях обновления.
Добавление записи
Добавление новой записи в набор записей включает вызов функции элемента набора записей AddNew , задание значений элементов данных поля новой записи и вызов функции элемента элемента Update для записи записи в источник данных.
В качестве предварительного условия для вызова AddNew
набор записей не должен быть открыт как доступный только для чтения. Функции-члены CanUpdate
CanAppend
позволяют определить эти условия.
При вызове AddNew
:
Запись в буфере редактирования сохраняется, поэтому его содержимое можно восстановить, если операция отменена.
Элементы данных поля помечены, поэтому их можно обнаружить позже. Элементы данных поля также помечены как чистые (без изменений) и задают значение NULL.
После вызова AddNew
буфер редактирования представляет новую пустую запись, готовую к заполнению значениями. Для этого вручную задайте значения, назначив их. Вместо указания фактического значения данных для поля можно вызвать SetFieldNull
для указания значения NULL.
Чтобы зафиксировать изменения, вызовите Update
. При вызове Update
новой записи:
Если драйвер ODBC поддерживает
::SQLSetPos
функцию API ODBC, MFC использует функцию для добавления записи в источник данных. С помощью::SQLSetPos
MFC может эффективнее добавлять запись, так как не требуется создавать и обрабатывать инструкцию SQL.Если
::SQLSetPos
не удается использовать, MFC выполняет следующие действия:Если изменения не обнаружены,
Update
ничего не выполняется и возвращает значение 0.При наличии изменений
Update
создает инструкцию SQL INSERT . Столбцы, представленные всеми элементами данных грязного поля, перечислены в инструкции INSERT . Чтобы принудительно включить столбец, вызовите функцию-член SetFieldDirty :SetFieldDirty( &m_dataMember, TRUE );
Update
фиксирует новую запись — инструкция INSERT выполняется, и запись фиксируется в таблице источника данных (и набор записей, если не моментальный снимок), если транзакция не выполняется.Хранимая запись восстанавливается в буфер редактирования. Запись, которая была текущей перед
AddNew
вызовом, снова выполняется независимо от того, успешно ли выполнена инструкция INSERT .
Совет
Для полного управления новой записью выполните следующий подход: задайте значения любых полей, которые будут иметь значения, а затем явно задайте все поля, которые будут оставаться null, вызывая
SetFieldNull
указатель на поле и параметр TRUE (по умолчанию). Если вы хотите убедиться, что поле не записывается в источник данных, вызовитеSetFieldDirty
указатель на поле и параметр FALSE и не изменяйте значение поля. Чтобы определить, разрешено ли значение null, вызовитеIsFieldNullable
поле.Совет
Чтобы определить, когда значения элементов данных набора записей изменяются, MFC использует значение PSEUDO_NULL, соответствующее каждому типу данных, который можно хранить в наборе записей. Если необходимо явно задать для поля значение PSEUDO_NULL, а поле уже имеет значение NULL, необходимо также вызвать
SetFieldNull
адрес поля в первом параметре и FALSE во втором параметре.
Видимость добавленных записей
Когда добавленная запись отображается в наборе записей? Добавленные записи иногда отображаются и иногда не видны в зависимости от двух вещей:
Что ваш драйвер способен.
Преимущества платформы.
Если драйвер ODBC поддерживает ::SQLSetPos
функцию API ODBC, MFC использует функцию для добавления записей. Добавленные ::SQLSetPos
записи отображаются для любого обновляемого набора записей MFC. Без поддержки функции добавленные записи не отображаются, и их необходимо вызвать Requery
. Использование ::SQLSetPos
также более эффективно.
Изменение существующей записи
Изменение существующей записи в наборе записей включает прокрутку до записи, вызов функции "Изменить элемент набора записей", задание значений элементов данных поля новой записи и вызов функции элемента элемента Update для записи измененной записи в источник данных.
В качестве предварительного условия для вызова Edit
набор записей должен быть обновляемым и в записи. Функции-члены CanUpdate
IsDeleted
позволяют определить эти условия. Текущая запись также не должна быть удалена, и в наборе записей должны быть записи (как IsBOF
и IsEOF
возвращать 0).
При вызове Edit
запись в буфере редактирования (текущая запись) сохраняется. Значения хранимой записи позже используются для определения того, изменились ли поля.
После вызова Edit
буфер редактирования по-прежнему представляет текущую запись, но теперь готов принять изменения элементов данных поля. Чтобы изменить запись, необходимо вручную задать значения всех элементов данных поля, которые вы хотите изменить. Вместо указания фактического значения данных для поля можно вызвать SetFieldNull
для указания значения NULL. Чтобы зафиксировать изменения, вызовите Update
.
Совет
Чтобы выйти из AddNew
режима, Edit
вызовите Move
параметр AFX_MOVE_REFRESH.
В качестве условия вызова Update
набор записей не должен быть пустым, и текущая запись не должна быть удалена. IsBOF
, IsEOF
и IsDeleted
все должны возвращать 0.
При вызове Update
измененной записи:
Если драйвер ODBC поддерживает
::SQLSetPos
функцию API ODBC, MFC использует функцию для обновления записи в источнике данных. При этом::SQLSetPos
драйвер сравнивает буфер редактирования с соответствующей записью на сервере, обновляя запись на сервере, если они отличаются. С помощью::SQLSetPos
MFC может эффективнее обновлять запись, так как не требуется создавать и обрабатывать инструкцию SQL.- или -
Если
::SQLSetPos
не удается использовать, MFC выполняет следующие действия:Если изменений не было,
Update
ничего не делает и возвращает значение 0.При наличии изменений
Update
создает инструкцию SQL UPDATE . Столбцы, перечисленные в инструкции UPDATE , основаны на измененных элементах данных поля.Update
фиксирует изменения — выполняет инструкцию UPDATE, а запись изменяется в источнике данных, но не фиксируется, если выполняется транзакция (см. раздел "Транзакция: выполнение транзакции в наборе записей( ODBC) для получения сведений о том, как транзакция влияет на обновление. ODBC сохраняет копию записи, которая также изменяет.В отличие от процесса,
AddNew
Edit
процесс не восстанавливает хранимую запись. Измененная запись остается на месте в качестве текущей записи.
Внимание
При подготовке к обновлению набора записей, вызывая
Update
вызов, убедитесь, что набор записей включает все столбцы, составляющие первичный ключ таблицы (или все столбцы любого уникального индекса в таблице или достаточно столбцов для уникальной идентификации строки). В некоторых случаях платформа может использовать только столбцы, выбранные в наборе записей, чтобы определить, какая запись в таблице требуется обновить. Без всех необходимых столбцов в таблице может быть обновлено несколько записей. В этом случае платформа создает исключения при вызовеUpdate
.Совет
При вызове
AddNew
илиEdit
после вызова любой функции, но перед вызовомUpdate
буфер редактирования обновляется с помощью сохраненной записи, заменив новую или редактированную запись. Это поведение позволяет прерватьAddNew
илиEdit
начать новую: если определить, что выполнение записи является неисправным, просто вызовEdit
илиAddNew
снова.
Удаление записи
Удаление записи из набора записей включает прокрутку до записи и вызов функции элемента delete набора записей. В отличие AddNew
от этогоEdit
Delete
, не требуется соответствующий вызовUpdate
.
В качестве предварительного условия для вызова Delete
набор записей должен быть обновляемым, и он должен находиться в записи. Функции CanUpdate
, и IsEOF
IsBOF
IsDeleted
члены позволяют определить эти условия.
При вызове Delete
:
Если драйвер ODBC поддерживает
::SQLSetPos
функцию API ODBC, MFC использует функцию для удаления записи в источнике данных. Использование::SQLSetPos
обычно является более эффективным, чем использование SQL.- или -
Если
::SQLSetPos
не удается использовать, MFC выполняет следующие действия:Текущая запись в буфере редактирования не выполняет резервное копирование как в
AddNew
иEdit
.Delete
создает инструкцию SQL DELETE , которая удаляет запись.Текущая запись в буфере редактирования не хранится как в
AddNew
иEdit
.Delete
фиксирует удаление — выполняет инструкцию DELETE . Запись помечена как удаленная в источнике данных и, если запись является моментальным снимком, в ODBC.Значения удаленной записи по-прежнему находятся в элементах данных поля набора записей, но элементы данных поля помечены null, а функция-член набора
IsDeleted
записей возвращает ненулевое значение.
Примечание.
После удаления записи необходимо прокрутить другую запись, чтобы повторно заполнить буфер редактирования данными новой записи. Это ошибка для повторного вызова
Delete
или вызоваEdit
.
Сведения об инструкциях SQL, используемых в операциях обновления, см. в статье SQL.
См. также
Набор записей (ODBC)
Набор записей. Дополнительные сведения об обновлениях (ODBC)
Обмен данными полей записей (RFX)