Поделиться через


Наборы записей. Принципы работы функций AddNew, Edit и Delete (ODBC)

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

В этом разделе объясняется, как AddNewработают функции класса CRecordset и EditDelete члены. В книге рассматриваются такие темы:

Примечание.

Этот раздел относится к объектам, производным от CRecordset, в которых пакетное получение строк не реализовано. Если вы используете массовое получение строк, ознакомьтесь с набором записей: извлечение записей в пакетной службе (ODBC).

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

Добавление записи

Добавление новой записи в набор записей включает вызов функции элемента набора записей AddNew , задание значений элементов данных поля новой записи и вызов функции элемента элемента Update для записи записи в источник данных.

В качестве предварительного условия для вызова AddNewнабор записей не должен быть открыт как доступный только для чтения. Функции-члены CanUpdate CanAppend позволяют определить эти условия.

При вызове AddNew:

  • Запись в буфере редактирования сохраняется, поэтому его содержимое можно восстановить, если операция отменена.

  • Элементы данных поля помечены, поэтому их можно обнаружить позже. Элементы данных поля также помечены как чистые (без изменений) и задают значение NULL.

После вызова AddNewбуфер редактирования представляет новую пустую запись, готовую к заполнению значениями. Для этого вручную задайте значения, назначив их. Вместо указания фактического значения данных для поля можно вызвать SetFieldNull для указания значения NULL.

Чтобы зафиксировать изменения, вызовите Update. При вызове Update новой записи:

  • Если драйвер ODBC поддерживает ::SQLSetPos функцию API ODBC, MFC использует функцию для добавления записи в источник данных. С помощью ::SQLSetPosMFC может эффективнее добавлять запись, так как не требуется создавать и обрабатывать инструкцию SQL.

  • Если ::SQLSetPos не удается использовать, MFC выполняет следующие действия:

    1. Если изменения не обнаружены, Update ничего не выполняется и возвращает значение 0.

    2. При наличии изменений Update создает инструкцию SQL INSERT . Столбцы, представленные всеми элементами данных грязного поля, перечислены в инструкции INSERT . Чтобы принудительно включить столбец, вызовите функцию-член SetFieldDirty :

      SetFieldDirty( &m_dataMember, TRUE );
      
    3. Update фиксирует новую запись — инструкция INSERT выполняется, и запись фиксируется в таблице источника данных (и набор записей, если не моментальный снимок), если транзакция не выполняется.

    4. Хранимая запись восстанавливается в буфер редактирования. Запись, которая была текущей перед 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драйвер сравнивает буфер редактирования с соответствующей записью на сервере, обновляя запись на сервере, если они отличаются. С помощью ::SQLSetPosMFC может эффективнее обновлять запись, так как не требуется создавать и обрабатывать инструкцию SQL.

    - или -

  • Если ::SQLSetPos не удается использовать, MFC выполняет следующие действия:

    1. Если изменений не было, Update ничего не делает и возвращает значение 0.

    2. При наличии изменений Update создает инструкцию SQL UPDATE . Столбцы, перечисленные в инструкции UPDATE , основаны на измененных элементах данных поля.

    3. Updateфиксирует изменения — выполняет инструкцию UPDATE, а запись изменяется в источнике данных, но не фиксируется, если выполняется транзакция (см. раздел "Транзакция: выполнение транзакции в наборе записей( ODBC) для получения сведений о том, как транзакция влияет на обновление. ODBC сохраняет копию записи, которая также изменяет.

    4. В отличие от процесса, AddNewEdit процесс не восстанавливает хранимую запись. Измененная запись остается на месте в качестве текущей записи.

    Внимание

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

    Совет

    При вызове AddNew или Edit после вызова любой функции, но перед вызовом Updateбуфер редактирования обновляется с помощью сохраненной записи, заменив новую или редактированную запись. Это поведение позволяет прервать AddNew или Edit начать новую: если определить, что выполнение записи является неисправным, просто вызов Edit или AddNew снова.

Удаление записи

Удаление записи из набора записей включает прокрутку до записи и вызов функции элемента delete набора записей. В отличие AddNew от этогоEditDelete, не требуется соответствующий вызовUpdate.

В качестве предварительного условия для вызова Deleteнабор записей должен быть обновляемым, и он должен находиться в записи. Функции CanUpdate, и IsEOFIsBOFIsDeleted члены позволяют определить эти условия.

При вызове Delete:

  • Если драйвер ODBC поддерживает ::SQLSetPos функцию API ODBC, MFC использует функцию для удаления записи в источнике данных. Использование ::SQLSetPos обычно является более эффективным, чем использование SQL.

    - или -

  • Если ::SQLSetPos не удается использовать, MFC выполняет следующие действия:

    1. Текущая запись в буфере редактирования не выполняет резервное копирование как в AddNew и Edit.

    2. Delete создает инструкцию SQL DELETE , которая удаляет запись.

      Текущая запись в буфере редактирования не хранится как в AddNew и Edit.

    3. Delete фиксирует удаление — выполняет инструкцию DELETE . Запись помечена как удаленная в источнике данных и, если запись является моментальным снимком, в ODBC.

    4. Значения удаленной записи по-прежнему находятся в элементах данных поля набора записей, но элементы данных поля помечены null, а функция-член набора IsDeleted записей возвращает ненулевое значение.

    Примечание.

    После удаления записи необходимо прокрутить другую запись, чтобы повторно заполнить буфер редактирования данными новой записи. Это ошибка для повторного вызова Delete или вызова Edit.

Сведения об инструкциях SQL, используемых в операциях обновления, см. в статье SQL.

См. также

Набор записей (ODBC)
Набор записей. Дополнительные сведения об обновлениях (ODBC)
Обмен данными полей записей (RFX)