Набор записей. Дополнительные сведения об обновлениях (ODBC)
Этот раздел относится к классам ODBC библиотеки MFC.
В этом разделе рассматриваются следующие вопросы.
Как другие операции, такие как транзакции, влияют на обновления.
Дополнительные сведения о функциях элементов обновления и удаления.
Примечание.
Этот раздел относится к объектам, производным от CRecordset
, в которых пакетное получение строк не реализовано. Если вы реализовали массовое получение строк, некоторые сведения не применяются. Например, нельзя вызывать AddNew
функции-члены Edit
, Delete
а Update
также функции-члены. Однако можно выполнять транзакции. Дополнительные сведения о выборке массовых строк см. в разделе Recordseting Records: Получение записей в пакетной службе (ODBC).
Как другие операции влияют на обновления
Обновления влияют на транзакции, действующие во время обновления, закрыв набор записей перед завершением транзакции и прокручиваясь перед завершением транзакции.
Влияние транзакций на обновления
Помимо понимания способа AddNew
работы Edit
и Delete
работы, важно понять, как Rollback
CommitTrans
BeginTrans
функции 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
.
Обновления и обновления других пользователей
При использовании набора записей для обновления данных обновления обновления повлияет на других пользователей. Аналогичным образом, обновления других пользователей во время существования набора записей влияют на вас.
В многопользовательской среде другие пользователи могут открывать наборы записей, содержащие некоторые из одинаковых записей, выбранных в наборе записей. Изменения записи перед получением его отражаются в наборе записей. Так как 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
Исключения. Исключения баз данных