JetPrepareUpdate 函数

适用于: Windows |Windows Server

JetPrepareUpdate 函数

JetPrepareUpdate 函数是执行更新的第一个操作,用于插入新记录或将现有记录替换为新值。 汇报方法是调用 JetPrepareUpdate,然后调用 JetSetColumnJetSetColumns 零次或多次,最后调用 JetUpdate 以完成操作。 JetPrepareUpdateJetUpdate 为更新操作设置边界,对于仅将记录的最终更新状态输入索引非常重要。 这既是更高效的,但当数据必须匹配有效状态时,这比设置列操作还要高。

有几种不同的选项用于插入或替换记录,下面将更详细地介绍这些选项。

    JET_ERR JET_API JetPrepareUpdate(
      __in          JET_SESID sesid,
      __in          JET_TABLEID tableid,
      __in          unsigned long prep
    );

参数

sesid

用于此调用的会话。

tableid

用于此调用的游标。

准备

可用于准备更新的选项,包括以下内容。

含义

JET_prepCancel

此标志会导致 JetPrepareUpdate 取消此游标的更新。

JET_prepInsert

此标志使游标准备插入新记录。 所有数据都初始化为记录的默认状态。 如果表具有自动递增列,则无论更新最终是成功、失败还是取消,都会为此记录分配新值。

JET_prepInsertCopy

此标志使游标准备插入现有记录的副本。 如果使用此选项,则必须有当前记录。 从当前记录复制新记录的初始状态。 以虚拟形式复制存储在记录之外的长值。

JET_prepInsertCopyDeleteOriginal

此标志使游标准备插入同一记录以及删除或原始记录。 它在主键已更改的情况下使用。

JET_prepReplace

此标志使游标准备替换当前记录。 如果表具有版本列,则版本列将设置为其序列中的下一个值。 如果此更新未完成,则记录中的版本值将不受影响。 对记录执行更新锁,以防止其他会话在此会话完成之前更新此记录。

JET_prepReplaceNoLock

此标志类似于JET_prepReplace,但不会采取任何锁定来阻止其他会话更新此记录。 相反,当此会话调用 JetUpdate 以完成更新时,可能会收到JET_errWriteConflict。

返回值

此函数返回具有以下返回代码之一 的JET_ERR 数据类型。 有关可能的 ESE 错误的详细信息,请参阅 可扩展存储引擎错误错误处理参数

返回代码

说明

JET_errSuccess

操作已成功完成。

JET_errAlreadyPrepared

JetPrepareUpdate 是使用用于准备的有效标志调用的,但未JET_prepCancel并且游标已处于准备状态。

JET_errClientRequestToStopJetService

无法完成操作,因为由于调用 JetStopService,与会话关联的实例上的所有活动都已停止。

JET_errInstanceUnavailable

无法完成该操作,因为与会话关联的实例遇到一个致命错误,该错误要求撤销对所有数据的访问以保护该数据的完整性。 此错误仅由 Windows XP 和更高版本返回。

JET_errInvalidParameter

给定的准备标志不是有效的标志。

JET_errNotInitialized

无法完成操作,因为尚未初始化与会话关联的实例。

JET_errNotInTransaction

调用 JetPrepareUpdate 以替换包含 SLV 列的记录。 SLV 列。 请注意,SLV 列是一项不用于常规用途的功能。 此功能用于支持 Microsoft Exchange 基础结构,不打算在应用程序中使用。

JET_errRestoreInProgress

无法完成操作,因为正在与会话关联的实例上执行还原操作。

JET_errRollbackError

JetPrepareUpdate 是使用 JET_prepCancel 调用的,但无法回滚对类型JET_coltypLongText和/或类型JET_coltypLongBinary列所做的所有更改。

JET_errSessionSharingViolation

此标志不能与来自多个线程的同一会话同时使用。 此错误仅由 Windows XP 和更高版本返回。

JET_errTermInProgress

无法完成操作,因为与会话关联的实例正在关闭。

JET_errUpdateNotPrepared

使用 JET_prepCancel调用 JetPrepareUpdate,但光标未处于准备状态。

成功后,游标将更改为准备状态以进行所需更新,或者在JET_prepCancel的情况下,游标将还原到未准备的状态,并放弃任何更改。

失败时,游标状态保持不变。 如果失败JET_errRollbackError则游标状态将更改为非准备状态,但并非所有更改都已还原。

备注

当记录共享JET_coltypLongText和/或JET_coltypLongBinary类型的数据时,插入记录的副本是一项重要的优化。 此数据在较大时存储在记录外,并且多个记录可以共享数据的相同物理表示形式。 在这种情况下,可以从任一记录更新数据,但这样做会导致数据突发,使每个记录都有其自己的副本。 无法通过修改另一条记录来更改一条记录中的数据。 此外,无法通过更新另一条记录来阻止一个记录的更新。 这是 ESE 的核心功能,称为记录级别锁定。

失败的 JetUpdate 操作会使游标处于更新准备状态。 这是为了允许更正某些错误(如错误的列值),而无需重新创建更新状态。 这意味着,在游标放弃更新的所有情况下,它都必须使用 JET_prepCancel 显式调用 JetPrepareUpdate

要求

要求

客户端

需要 Windows Vista、Windows XP 或 Windows 2000 Professional。

服务器

需要 Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。

标头

在 Esent.h 中声明。

Library

使用 ESENT.lib。

DLL

需要ESENT.dll。

另请参阅

JET_ERR
JET_SESID
JET_TABLEID
JetRetrieveColumn
JetSetColumn
JetUpdate