Функция JetUpdate
Применимо к: Windows | Windows Server
Функция JetUpdate
Функция JetUpdate выполняет операцию обновления, включая вставку новой строки в таблицу или обновление существующей строки. Удаление строки таблицы выполняется путем вызова JetDelete.
JetUpdate — это последний шаг при выполнении вставки или обновления. Обновление начинается с вызова JetPrepareUpdate , а затем путем вызова JetSetColumn или JetSetColumns один или несколько раз, чтобы задать состояние записи. Наконец, вызывается JetUpdate для завершения операции обновления. Индексы обновляются только JetUpdate или JetUpdate2, но не во время JetSetColumn или JetSetColumns.
JET_ERR JET_API JetUpdate(
__in JET_SESID sesid,
__in JET_TABLEID tableid,
__out_opt void* pvBookmark,
__in unsigned long cbBookmark,
__out_opt unsigned long* pcbActual
);
Параметры
sesid
Сеанс, используемый для этого вызова.
tableid
Курсор, используемый для этого вызова.
pvBookmark
Указатель на возвращенную закладку для вставленной строки.
cbBookmark
Размер буфера, на который указывает pvBookmark.
pcbActual
Возвращаемый размер закладки для вставленной строки, возвращаемой в pvBookmark.
Возвращаемое значение
Эта функция возвращает тип данных JET_ERR с одним из следующих кодов возврата. Дополнительные сведения о возможных ошибках ESE см. в разделах Ошибки подсистемы расширяемого хранилища и Параметры обработки ошибок.
Код возврата |
Описание |
---|---|
JET_errSuccess |
Операция выполнена успешно. |
JET_errBufferTooSmall |
Указанный буфер для закладки записи недостаточно велик для хранения закладки записи. |
JET_errClientRequestToStopJetService |
Невозможно выполнить операцию, так как все действия экземпляра, связанного с сеансом, прекратились в результате вызова JetStopService. |
JET_errColumnIllegalNull |
То же, что и JET_errNullInvalid. |
JET_errDiskFull |
Операция обновления требует увеличения файла базы данных или выделения файла журнала, но диск, на котором находится файл базы данных или ряд журналов, заполнен. Кроме того, файл базы данных находится на томе в формате FAT32, а размер файла базы данных уже составляет 4 ГБ, что является ограничением на каждый файл для FAT32. |
JET_errInstanceUnavailable |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, столкнулся с неустранимой ошибкой, требующей отмены доступа ко всем данным для защиты целостности этих данных. Windows XP: Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. |
JET_errInvalidParameter |
Заданный параметр подготовки в функции JetPrepareUpdate не является допустимым флагом. |
JET_errKeyDuplicate |
Ключ индекса для этой записи является дубликатом другого ключа индекса для другой записи, уже существующей в таблице, и индекс не допускает дублирования. |
JET_errKeyTruncated |
Вставленная или обновленная запись имеет один или несколько индексов, для которых созданный ключ превысил бы максимально допустимый размер. В результате операции не удалось предотвратить усечение ключа. |
JET_errMultiValuedIndexViolation |
Вставленная или обновленная запись содержит индексированные многозначные столбцы с двумя или более значениями, идентичными в пределах максимального размера ключа длины, установленного для индекса. В результате запись содержит две одинаковые записи в индексе, которая является недопустимой. |
JET_errNotInitialized |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, еще не инициализирован. |
JET_errNullInvalid |
Один или несколько столбцов в вставленной записи или в обновленном состоянии заменяемой записи имеет значение NULL , что нарушает определенное ограничение для этих столбцов. |
JET_errNullKeyDisallowed |
Один или несколько индексов не допускают ключ NULL , а вставленное или обновленное состояние заменяемой записи нарушает это определенное ограничение. |
JET_errRecordPrimaryChanged |
Операция замены записей обновила первичный ключ. Обновления столбцов первичного ключа необходимо удалить существующую запись и вставить новую запись с нужными данными. |
JET_errRestoreInProgress |
Невозможно выполнить операцию, так как операция восстановления выполняется в экземпляре, связанном с сеансом. |
JET_errSessionSharingViolation |
Один и тот же сеанс нельзя использовать для нескольких потоков одновременно. Windows XP: Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. |
JET_errTermInProgress |
Невозможно завершить операцию, так как экземпляр, связанный с сеансом, завершает работу. |
JET_errTransReadOnly |
Попытка обновления в область транзакции только для чтения является недопустимой. Транзакция только для чтения — это транзакция, запущенная с помощью вызова JetBeginTransaction2 с JET_bitTransactionReadOnly. Windows XP: Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. |
JET_errUpdateNotPrepared |
Метод JetPrepareUpdate был вызван с JET_prepCancel но курсор не находился в подготовленном состоянии. |
JET_errVersionStoreOutOfMemory |
Операция завершилась сбоем, так как недостаточно памяти для хранения транзакционных сведений об обновлении. |
JET_errWriteConflict |
Другой сеанс ранее заблокировал запись для обновления. Попытка обновления, предпринятая этим сеансом, завершится ошибкой. |
При успешном выполнении операция открытого обновления курсора завершается. Если для таблицы определен столбец с автоматическим приращением, то это значение устанавливается для вставленных записей. Если для таблицы определен столбец версии, то его значение инициализируется для вновь вставленных записей или увеличивается при каждой замене записи. Обновляются все индексы, включая кластеризованные и неклатеризованные индексы.
При сбое никакие изменения в базе данных не вносятся. До вставки и до замены функции обратного вызова могли быть вызваны, но после вставки и после замены обратные вызовы не будут вызываться, так как последний не может привести к сбою обновления. Буфер копирования курсора остается в подготовленном состоянии, поэтому существует возможность постепенно исправить проблемы, вызвавшие ошибки, и повторить операцию обновления.
Комментарии
Функции обратного вызова можно зарегистрировать для вызова до или после вставки, а также до или после обновления.
Ограничения размера записей применяются JetSetColumn, а не JetUpdate.
Важно понимать влияние выполнения большого количества операций обновления в одной транзакции. Каждое обновление базы данных должно отслеживаться ядром СУБД в хранилище версий. Хранилище версий содержит динамическую запись всех разных версий каждой записи или записи индекса в базе данных, которую могут видеть все активные транзакции. Эти версии используются для поддержки управления параллелизмом с несколькими версиями, используемого ядром СУБД для поддержки транзакций, использующих изоляцию snapshot. После того как ядро СУБД исчерпало ресурсы, используемые для хранения этих версий, оно больше не сможет принимать дальнейшие изменения, пока не будут завершены некоторые транзакции, чтобы позволить освободить эти ресурсы. Когда подсистема находится в этом состоянии, все обновления завершатся сбоем с JET_errVersionStoreOutOfMemory. Ресурсами, доступными ядру СУБД для хранения этих версий, можно управлять с помощью JetSetSystemParameter с JET_paramMaxVerPages и JET_paramGlobalMinVerPages.
Требования
Требование | Значение |
---|---|
Клиент |
Требуется Windows Vista, Windows XP или Windows 2000 Professional. |
Сервер |
Требуется Windows Server 2008, Windows Server 2003 или Windows 2000 Server. |
Верхняя часть |
Объявлено в Esent.h. |
Библиотека |
Используйте ESENT.lib. |
DLL |
Требуется ESENT.dll. |
См. также:
JET_ERR
JET_SESID
JET_TABLEID
JetDelete
JetPrepareUpdate
JetRegisterCallback
JetRetrieveColumn
JetRetrieveColumns
JetSetColumn
JetSetColumns
JetSetSystemParameter
Системные параметры