JetOpenTemporaryTable 函数

适用于: Windows |Windows Server

JetOpenTemporaryTable 函数

JetOpenTemporaryTable 函数创建具有单个索引的可变表,该表可用于存储和检索记录,就像通过 JetCreateTableColumnIndex 创建的普通表一样。

Windows Vista:JetOpenTemporaryTable 在 Windows Vista 中引入。

临时表的易失性比普通表快。 在以纯顺序方式访问记录集时,它们可以快速排序和执行重复删除。

    JET_ERR JET_API JetOpenTemporaryTable(
      __in          JET_SESID sesid,
      __in          JET_OPENTEMPORARYTABLE* popentemporarytable
    );

参数

sesid

将用于此调用的会话。

popentemporarytable

指向 JET_OPENTEMPORARYTABLE 结构的指针,该结构包含要在输入时创建的临时表的说明。 成功调用后, 结构包含临时表和列标识的句柄。

返回值

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

返回代码

说明

JET_errSuccess

操作已成功完成。

JET_errOutOfMemory

操作失败,因为无法分配足够的内存来完成此操作。

如果主机进程的地址空间变得过于分散,JetOpenTemporaryTable 可以返回JET_errOutOfMemory。 无论存储的数据量如何,临时表管理器都将为每个创建的临时表分配 1 MB 的地址空间块。

JET_errInvalidParameter

提供的其中一个参数包含意外值,或者多个参数值的组合导致意外结果。

此错误在以下情况下由 JetOpenTemporaryTable 返回:

JET_errNotInitialized

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

JET_errClientRequestToStopJetService

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

JET_errInstanceUnavailable

操作无法完成,因为与会话关联的实例遇到严重错误,要求撤销对所有数据的访问权限以保护该数据的完整性。

Windowsxp: 此错误仅由 Windows XP 及更高版本返回。

JET_errTermInProgress

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

JET_errRestoreInProgress

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

JET_errSessionSharingViolation

同一会话不能同时用于多个线程。

Windowsxp: 此错误仅由 Windows XP 及更高版本返回。

JET_errInvalidSesid

会话句柄无效或引用已关闭的会话。

注意 并非所有情况下都返回此错误。 句柄仅在尽最大努力的基础上进行验证。

JET_errOutOfCursors

操作失败,因为引擎无法分配打开新游标所需的资源。 游标资源是使用 JetSetSystemParameterJET_paramMaxCursors 配置的。

JET_errTooManySorts

操作失败,因为引擎无法分配创建临时表所需的资源。 临时表资源是使用 JetSetSystemParameterJET_paramMaxTemporaryTables配置的。

JET_errCannotMaterializeForwardOnlySort

JetOpenTemporaryTable 失败,因为指定了JET_bitTTForwardOnly,并且无法使用仅向前优化创建指定的临时表。

Windows Server 2003: 此错误仅由 Windows Server 2003 及更高版本返回。

JET_errTooManyColumns

尝试向表添加过多列。 一个表的固定列不能超过JET_ccolFixedMost个,长度不能超过JET_ccolVarMost个可变长度列,并且不能超过JET_ccolTaggedMost个标记列。

JET_errTooManyOpenTables

操作失败,因为引擎无法分配缓存表架构所需的资源。 若要配置具有可缓存架构的表数,请将 JetSetSystemParameterJET_paramMaxOpenTables配合使用。

JET_errInvalidCodePage

JET_COLUMNDEF 结构的 cp 成员未设置为有效的代码页。 文本列的唯一有效值为英语 (1252) 和 Unicode (1200) 。 值为 0 表示将使用默认值 (英语、1252) 。

JET_errInvalidColumnType

JET_COLUMNDEFcoltyp 成员未设置为有效的列类型。

JET_errInvalidLanguageId

无法创建索引,因为尝试使用的区域设置 ID 无效。 区域设置 ID 可能完全无效,或者可能未安装关联的语言包。

JET_errInvalidLCMapStringFlags

无法创建索引,因为尝试使用一组无效的规范化标志。

Windowsxp: 此错误仅由 Windows XP 及更高版本返回。

Windows 2000: 在 Windows 2000 上,无效的规范化标志将导致JET_errIndexInvalidDef。

JET_errIndexInvalidDef

无法创建索引,因为指定的索引定义无效。 JetOpenTemporaryTable 在以下情况下将返回此错误:

  • 指定了中性语言区域设置。

  • 指定了一组无效的规范化标志。

Windows 2000: 此错误仅由 Windows 2000 返回。

JET_errTooManyOpenIndexes

操作失败,因为引擎无法分配缓存表索引所需的资源。 若要配置具有可缓存架构的索引数,请将 JetSetSystemParameterJET_paramMaxOpenTables配合使用。

成功后,将返回在新创建的临时表上打开的游标。 临时数据库的状态将准备好包含新的临时表。 数据库引擎使用的任何普通数据库的状态将保持不变。

失败时,不会创建临时表,也不会返回游标。 可以更改临时数据库的状态。 数据库引擎使用的任何普通数据库的状态将保持不变。

备注

临时表不支持数据库引擎通常支持的列定义选项的完整补充。 事实上,仅支持JET_bitColumnFixed和JET_bitColumnTagged。 这意味着无法在临时表中创建自动递增列、版本列或多值列。 最后,不支持托管更新列,因为它们一次只能由一个会话使用。 如果请求了这些选项中的任何一个,则将忽略它们。

临时表不支持默认值。 如果提供的列定义包含默认值规范,则将忽略该规范。

由于许多不同的 ESE 函数,临时表将返回到调用方。 例如,设置了 JET_IdxInfo 选项的 JetGetIndexInfo 将返回一个临时表,其中包含给定索引中所有键列的列表。 临时表遵循与普通临时表相同的生命周期规则,如此处所述。

临时表也由数据库引擎在内部用于许多任务。 其中最重要的任务是在现有表上创建索引。 临时表将用于对用于构造该索引的索引键进行排序。

所有临时表都存储在临时数据库中。 临时数据库是在 ESE 实例的生存期内维护的特殊数据库文件,在关闭或重新启动该实例时会删除该文件。 可以使用 JetSetSystemParameterJET_paramTempPath 配置临时数据库的位置。 如果应用程序大量使用临时表或频繁创建索引,则相对于事务日志文件和数据库文件在磁盘上放置临时数据库可能很重要。

临时表的生命周期与引用它的游标相关联。 如果引用临时表的所有游标都以隐式或显式方式关闭,则将删除临时表。 如果在事务中创建临时表,并且该事务随后回滚,则将删除临时表,因为此时引用该临时表的任何游标都将隐式关闭。 新游标只能通过使用 JetDupCursor 来引用临时表。 在这种情况下,新游标将定位在临时表的第一个索引项上。 JetDupCursor 仅在临时表的某些使用阶段有效。 有关详细信息,请参阅有关临时表游标功能的备注。 不能一次从多个会话引用临时表。

谨慎JetDupCursor 中存在影响临时表的重要问题。 如果尝试复制处于仅向前模式的临时表,则生成的游标将无法正确创建,并且将发生故障。 在具体化临时表上复制光标仍然是安全的。

临时表管理器可以通过三种方式实现临时表。 第一种方法是维护内存中表。 此策略速度最快,但只能用于小型、简单的临时表。 第二种方法是创建可以使用仅向前迭代器驱动的基于磁盘的排序。 此策略只能在特定情况下使用,并且是从大型数据集中对重复项进行排序和删除的最快方法。 第三种方法是在临时数据库中创建 B+ 树来保存临时表。 此策略最慢,但用途最广,称为具体化临时表。 这些策略可以结合使用,最终实现临时表请求的功能。

如果临时表未具体化,则主要在两个主要阶段使用它。 第一阶段是插入阶段,其中表填充其初始数据集。 在此阶段,仅允许插入数据。 当尝试使用 JetMoveJetSeek 移动光标时,此阶段将结束。 第二个阶段是数据提取阶段。 在此阶段,可以根据创建临时表时请求的功能提取存储在临时表中的数据。

临时表游标功能

具体化临时表时,游标具有以下功能,但可能会受到所请求选项的进一步限制:

当临时表未具体化且处于插入阶段时,游标具有以下功能,但可能会受到所请求选项的进一步限制:

当临时表未具体化且处于提取阶段时,游标具有以下功能,但可能会受到所请求选项的进一步限制:

要求

要求

客户端

需要 Windows Vista。

服务器

需要 Windows Server 2008。

标头

在 Esent.h 中声明。

Library

使用 ESENT.lib。

DLL

需要ESENT.dll。

另请参阅

JET_ERR
JET_SESID
JET_OPENTEMPORARYTABLE
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetRollback
JetSeek
JetSetSystemParameter
信息参数
临时数据库参数