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


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

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

В этом разделе рассматриваются следующие вопросы.

Примечание.

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

Как другие операции влияют на обновления

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

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

Помимо понимания способа AddNewработы Editи Delete работы, важно понять, как Rollback CommitTransBeginTransфункции CDatabase и члены работают с функциями обновления CRecordset.

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

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

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

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

Внимание

Если вы используете ядро СУБД Microsoft Jet, закрытие набора записей внутри явной транзакции не приводит к освобождению строк, которые были изменены или блокированы, пока явная транзакция не будет зафиксирована или откатена. Рекомендуется всегда открывать и закрывать наборы записей внутри или вне явной транзакции Jet.

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

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

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

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

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

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

Совет

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

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

Дополнительные сведения об обновлении и удалении

В этом разделе содержатся дополнительные сведения, которые помогут вам работать с 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 необходимо обновить только одну и одну запись. Эта запись является текущей записью, которая соответствует значениям данных в полях набора записей. Если по какой-либо причине не затронуты записи или несколько записей затронуты, создается исключение, содержащее одно из следующих значений RETCODE :

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED

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

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

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

См. также

Набор записей (ODBC)
Набор записей. Порядок выборки записей в наборе (ODBC)
Обмен данными полей записей (RFX)
SQL
Исключения. Исключения баз данных