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
);
parameters
sesid
用于此调用的会话。
tableid
要用于此调用的游标。
pvBookmark
指向已插入行的返回书签的指针。
cbBookmark
pvBookmark 指向的缓冲区的大小。
2013
pvBookmark 中返回的插入行的书签的返回大小。
返回值
此函数返回具有以下返回代码之一 的JET_ERR 数据类型。 有关可能的 ESE 错误的详细信息,请参阅 可扩展存储引擎错误 和 错误处理参数。
返回代码 |
说明 |
---|---|
JET_errSuccess |
操作已成功完成。 |
JET_errBufferTooSmall |
记录书签的给定缓冲区不够大,无法存储记录书签。 |
JET_errClientRequestToStopJetService |
无法完成操作,因为与会话关联的实例上的所有活动都因调用 JetStopService 而停止。 |
JET_errColumnIllegalNull |
与 JET_errNullInvalid 相同。 |
JET_errDiskFull |
更新操作需要数据库文件增长或日志文件分配,但数据库文件或日志系列所在的磁盘驱动器已满。 或者,数据库文件位于 FAT32 格式卷上,并且数据库文件已是 4GBytes,即 FAT32 的每个文件限制。 |
JET_errInstanceUnavailable |
无法完成操作,因为与会话关联的实例遇到严重错误,要求撤销对所有数据的访问权限以保护该数据的完整性。 Windowsxp: 此错误仅由 Windows XP 及更高版本返回。 |
JET_errInvalidParameter |
JetPrepareUpdate 函数中的给定 prep 参数不是有效的标志。 |
JET_errKeyDuplicate |
此记录的索引键是表中已有的另一条记录的另一个索引键的副本,并且索引不允许重复。 |
JET_errKeyTruncated |
插入或更新的记录具有一个或多个索引,生成的键将超过允许的最大大小。 因此,操作无法阻止密钥截断。 |
JET_errMultiValuedIndexViolation |
插入或更新的记录具有索引的多值列,其中两个或更多值在为索引设置的最大长度键大小内相同。 因此,该记录在索引中具有两个无效的相同条目。 |
JET_errNotInitialized |
无法完成操作,因为与会话关联的实例尚未初始化。 |
JET_errNullInvalid |
要插入的记录中的一列或多列或处于要替换的记录的更新状态为 NULL ,这违反了这些列的定义约束。 |
JET_errNullKeyDisallowed |
定义一个或多个索引以不允许 NULL 键,并且要替换的记录的插入或更新状态违反了此定义的约束。 |
JET_errRecordPrimaryChanged |
记录替换操作已更新主键。 汇报主键列必须通过删除现有记录并插入包含所需数据的新记录来完成。 |
JET_errRestoreInProgress |
无法完成该操作,因为正在对与会话关联的实例执行还原操作。 |
JET_errSessionSharingViolation |
同一会话不能同时用于多个线程。 Windowsxp: 此错误仅由 Windows XP 及更高版本返回。 |
JET_errTermInProgress |
无法完成操作,因为正在关闭与会话关联的实例。 |
JET_errTransReadOnly |
在只读事务范围内尝试更新是非法的。 只读事务是使用对 JetBeginTransaction2 的调用和JET_bitTransactionReadOnly启动的事务。 Windowsxp: 此错误仅由 Windows XP 及更高版本返回。 |
JET_errUpdateNotPrepared |
使用 JET_prepCancel调用 JetPrepareUpdate,但光标未处于准备状态。 |
JET_errVersionStoreOutOfMemory |
操作失败,因为没有足够的内存来保留有关更新的事务信息。 |
JET_errWriteConflict |
另一个会话之前已锁定要更新的记录。 此会话尝试的更新将失败。 |
成功后,将完成游标上的打开更新操作。 如果为表定义了自动递增列,则为插入的记录设置此值。 如果为表定义了版本列,则其值将针对新插入的记录进行初始化,或在每次替换记录时递增。 所有索引(包括聚集索引和非聚集索引)都会更新。
失败时,不会对数据库进行任何更改。 插入前和替换之前可能已调用回调函数,但插入后和替换后回调不会调用,因为后者不会导致更新失败。 游标复制缓冲区保持其准备状态,以便有机会以增量方式更正导致错误的问题并重试更新操作。
备注
回调函数可以注册为在插入之前或之后以及更新之前或之后调用。
记录大小限制由 JetSetColumn 强制实施,而不是通常由 JetUpdate 强制执行。
请务必了解在单个事务中执行大量更新操作的影响。 数据库的每个更新必须由版本存储中的数据库引擎跟踪。 版本存储保存数据库中每个记录或索引项的所有不同版本的实时记录,所有活动事务都可以看到这些记录或索引项。 这些版本用于支持数据库引擎使用的多版本控制并发控制,以支持使用快照隔离的事务。 一旦数据库引擎耗尽了用于存储这些版本的资源,那么在完成某些事务以允许回收这些资源之前,它将无法再接受进一步的更改。 当引擎处于此状态时,所有更新都将失败并JET_errVersionStoreOutOfMemory。 可以使用 JetSetSystemParameter 和 JET_paramMaxVerPages 和 JET_paramGlobalMinVerPages 来控制数据库引擎可用于存储这些版本的资源。
要求
要求 | 值 |
---|---|
客户端 |
需要 Windows Vista、Windows XP 或 Windows 2000 专业版。 |
服务器 |
需要 Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。 |
标头 |
在 Esent.h 中声明。 |
Library |
使用 ESENT.lib。 |
DLL |
需要ESENT.dll。 |
另请参阅
JET_ERR
JET_SESID
JET_TABLEID
JetDelete
JetPrepareUpdate
JetRegisterCallback
JetRetrieveColumn
JetRetrieveColumns
JetSetColumn
JetSetColumns
JetSetSystemParameter
系统参数