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


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

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

Содержание раздела:

  • Влияние других операций, например транзакций, на обновления.

  • Собственные обновления и обновления других пользователей.

  • Дополнительные сведения о функциях-членах Update и Delete.

Примечание

В этом разделе приведены сведения, относящиеся к объектам, производным от класса CRecordset, в котором групповая выборка строк не реализована.Если групповая выборка строк реализована, некоторые сведения могут быть неприменимы.Например, в этом случае не допускается вызов функций-членов AddNew, Edit, Delete и Update, однако поддерживается выполнение транзакций.Дополнительные сведения о групповой выборке строк см. в разделе Набор записей: пакетная выборка строк (ODBC).

Влияние других операций, например транзакций, на обновления

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

Влияние транзакций на обновления

Помимо понимания принципов работы функций-членов AddNew, Edit и Delete, важно понимать порядок использования функций-членов BeginTrans, CommitTrans и Rollback класса CDatabase совместно с функциями обновления класса CRecordset.

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

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

Влияние закрытия набора записей на обновление

Если набор записей или связанный с ним объект CDatabase закрывается во время выполнения транзакции (до вызова метода CDatabase::CommitTrans или CDatabase::Rollback), выполняется автоматический откат транзакции (если управление серверной частью базы данных осуществляется не с помощью ядра Microsoft Jet).

Предупреждение

Если используется ядро баз данных Microsoft Jet, при закрытии набора записей в явной транзакции измененные строки или столбцы, а также установленные блокировки освобождаются только в случае подтверждения или отката явной транзакции.Рекомендуется всегда выполнять обе операции (открытие и закрытие набора записей) либо внутри, либо вне явной транзакции Jet.

Влияние прокрутки на обновление

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

Собственные обновления и обновления других пользователей

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

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

Записи, добавленные другими пользователями после открытия набора записей, отображаются в нем только по отдельному запросу. При работе с динамическим набором записей изменения, выполненные другими пользователями, отображаются в наборе при прокрутке к измененной записи. При работе с моментальным снимком набора записей изменения отображаются только по специальному запросу снимка. Чтобы просмотреть записи моментального снимка набора, добавленные или удаленные другими пользователями, или записи динамического набора, добавленные другими пользователями, вызовите метод CRecordset::Requery для повторного построения набора записей. (Обратите внимание, что в динамическом наборе отображаются удаляемые другими пользователями записи.) Также можно вызвать метод Requery, чтобы отобразить добавленные и скрыть удаленные записи.

Совет

Чтобы выполнить принудительное кэширование всего моментального снимка, вызовите метод MoveLast непосредственно после открытия снимка.После этого вызовите MoveFirst, чтобы начать работу с записями.Метод MoveLast аналогичен прокрутке всех записей, однако при его выполнении все записи извлекаются одновременно.Обратите внимание, что использование этого способа может привести к снижению производительности и не является обязательным для некоторых драйверов.

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

Дополнительные сведения о функциях-членах Update и Delete

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

Успешное завершение и ошибка обновления

В случае успешного выполнения функции-члена Update режим AddNew или Edit завершается. Чтобы возобновить режим AddNew или Edit, вызовите функцию-член AddNew или Edit.

В случае ошибки при выполнении функции-члена Update (возвращается значение FALSE или вызывается исключение) продолжается работа в режиме AddNew или Edit (в соответствии с последней вызванной функцией). Затем можно выполнить одно из следующих действий:

  • Изменение члена данных поля и повторный вызов функции-члена Update.

  • Вызов функции-члена AddNew для восстановления значений Null членов данных полей, установка их новых значений и повторный вызов функции-члена Update.

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

  • Вызовите метод Move (в том числе метод Move с параметром AFX_MOVE_REFRESH или 0), который выполняет очистку всех изменений и завершает действующий режим AddNew или Edit.

Функции-члены Update и Delete

Сведения, представленные в этом разделе, применимы к обеим функциям-членам Update и Delete.

При выполнении операции Update или Delete обновляется только одна запись. В этом случае обновляется текущая запись, соответствующая значениям данных в полях набора записей. Если по каким-либо причинам записи не изменяются или изменяется несколько записей, вызывается исключение с одним из следующих значений RETCODE:

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED

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

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED — если при использовании режима оптимистичной блокировки другой пользователь изменяет запись таким образом, что невозможно определить обновляемую или удаляемую запись.

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED — если для обновляемой таблицы не существует первичного ключа или уникального индекса, а в наборе записей содержится недостаточное число столбцов для уникального определения строки таблицы.

См. также

Основные понятия

Набор записей (ODBC)

Набор записей. Порядок выборки записей в наборе (ODBC)

Обмен данными полями записей (RFX)

SQL

Исключения. Исключения баз данных