JetOpenTemporaryTable 函数
适用于:Windows |Windows服务器
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 |
操作无法完成,因为与会话关联的实例遇到了一个致命错误,该错误要求撤销对所有数据的访问以保护该数据的完整性。 Windows XP:此错误仅由 Windows XP 和更高版本返回。 |
JET_errTermInProgress |
操作无法完成,因为与会话关联的实例正在关闭。 |
JET_errRestoreInProgress |
该操作无法完成,因为还原操作正在与会话关联的实例上进行。 |
JET_errSessionSharingViolation |
同一会话不能同时用于多个线程。 Windows XP:此错误仅由 Windows XP 和更高版本返回。 |
JET_errInvalidSesid |
会话句柄无效或引用已关闭的会话。 注意 在所有情况下都不会返回此错误。 仅尽最大努力验证句柄。 |
JET_errOutOfCursors |
操作失败,因为引擎无法分配打开新游标所需的资源。 游标资源使用 JetSetSystemParameter 和 JET_paramMaxCursors 进行配置。 |
JET_errTooManySorts |
操作失败,因为引擎无法分配创建临时表所需的资源。 临时表资源使用 JetSetSystemParameter 和 JET_paramMaxTemporaryTables 进行配置。 |
JET_errCannotMaterializeForwardOnlySort |
JetOpenTemporaryTable 失败,因为指定了JET_bitTTForwardOnly,并且无法使用仅前向优化创建指定的临时表。 Windows Server 2003:此错误仅由 Windows Server 2003 及更高版本返回。 |
JET_errTooManyColumns |
尝试向表添加过多列。 表不能超过JET_ccolFixedMost固定列、不超过JET_ccolVarMost可变长度列,且不超过JET_ccolTaggedMost标记列。 |
JET_errTooManyOpenTables |
操作失败,因为引擎无法分配缓存表架构所需的资源。 若要配置具有可缓存架构的表数,请将 JetSetSystemParameter 与 JET_paramMaxOpenTables配合使用。 |
JET_errInvalidCodePage |
JET_COLUMNDEF结构的 cp 成员未设置为有效的代码页。 文本列的唯一有效值为英语 (1252) 和 Unicode (1200) 。 值为 0 表示将使用默认值 (英语、1252) 。 |
JET_errInvalidColumnType |
JET_COLUMNDEF的 coltyp 成员未设置为有效的列类型。 |
JET_errInvalidLanguageId |
无法创建索引,因为尝试使用无效的区域设置 ID。 区域设置 ID 可能完全无效,或者可能未安装关联的语言包。 |
JET_errInvalidLCMapStringFlags |
无法创建索引,因为尝试使用无效的规范化标志集。 Windows XP:此错误仅由 Windows XP 和更高版本返回。 Windows 2000:在 2000 Windows,规范化标志无效将导致JET_errIndexInvalidDef。 |
JET_errIndexInvalidDef |
无法创建索引,因为指定了无效的索引定义。 JetOpenTemporaryTable 将在以下条件下返回此错误:
Windows 2000:此错误仅在 2000 Windows返回。 |
JET_errTooManyOpenIndexes |
操作失败,因为引擎无法分配缓存表索引所需的资源。 若要配置具有可缓存架构的索引数,请将 JetSetSystemParameter 与 JET_paramMaxOpenTables配合使用。 |
成功后,将返回在新创建的临时表上打开的游标。 临时数据库的状态将准备好包含新的临时表。 数据库引擎使用的任何普通数据库的状态将保持不变。
失败时,不会创建临时表,并且不会返回游标。 可以更改临时数据库的状态。 数据库引擎使用的任何普通数据库的状态将保持不变。
注解
临时表不支持数据库引擎通常支持的列定义选项的完整补充。 事实上,仅支持JET_bitColumnFixed和JET_bitColumnTagged。 这意味着无法在临时表中创建自动递增、版本或多值列。 最后,不支持托管更新列,因为它们一次只能由一个会话使用。 如果请求这些选项中的任何一个,则将被忽略。
临时表不支持默认值。 如果提供了包含默认值规范的列定义,则将忽略该规范。
由于许多不同的 ESE 函数,临时表将返回到调用方。 例如,具有JET_IdxInfo选项集的 JetGetIndexInfo 将返回一个临时表,其中包含给定索引中所有键列的列表。 临时表遵循与普通临时表相同的生命周期规则,如此处所述。
对于许多任务,数据库引擎也在内部使用临时表。 其中最重要的任务是创建基于现有表的索引。 临时表将用于对用于构造该索引的索引键进行排序。
所有临时表都存储在临时数据库中。 临时数据库是一个特殊的数据库文件,在 ESE 实例的生存期内维护,并在该实例关闭或重启时被删除。 可以使用 JetSetSystemParameter 和 JET_paramTempPath 配置临时数据库的位置。 如果应用程序大量使用临时表或频繁创建索引,则相对于事务日志文件和数据库文件的磁盘上放置临时数据库可能很重要。
临时表的生命周期绑定到引用它的游标。 如果引用临时表的所有游标都已关闭,则隐式或显式关闭临时表,则将删除临时表。 如果在事务内创建了临时表,并且该事务随后回滚,则会删除临时表,因为此时引用该表的任何游标都将隐式关闭。 新游标只能通过 JetDupCursor 使用来引用临时表。 在这种情况下,新游标将放置在临时表的第一个索引项上。 JetDupCursor 仅在临时表的某些使用阶段有效。 有关详细信息,请参阅有关临时表游标功能的备注。 不能一次从多个会话引用临时表。
谨慎JetDupCursor 中存在影响临时表的重要问题。 如果尝试复制处于仅向前模式的临时表,则生成的游标将不会正确创建,并且会发生故障。 在具体化的临时表上复制游标仍然很安全。
临时表管理器可以通过三种方式实现临时表。 第一种方法是维护内存中表。 此策略是最快策略,但只能用于小型、简单、临时表。 第二种方法是创建一个基于磁盘的排序,该排序可以使用仅向前迭代器进行驱动。 此策略只能在某些情况下使用,是从非常大的数据集中对重复项进行排序和删除的最快速方法。 第三种方法是在临时数据库中创建 B+ 树来保存临时表。 此策略最慢,但最通用,称为具体化的临时表。 这些策略可以组合使用,最终实现临时表请求的功能。
当临时表未具体化时,它主要用于两个主要阶段。 第一个阶段是插入阶段,其中表填充了其初始数据集。 在此阶段,仅允许数据插入。 当尝试使用 JetMove 或 JetSeek 移动光标时,此阶段将结束。 第二个阶段是数据提取阶段。 在此阶段,可以根据创建临时表时请求的功能提取存储在临时表中的数据。
临时表游标功能
具体化临时表时,游标具有以下功能,但可能受请求的选项进一步限制:
当临时表未具体化且处于插入阶段时,游标具有以下功能,但可能受请求的选项进一步限制:
-
注意 导致转换为提取阶段。
-
注意 导致转换为提取阶段。
当临时表未具体化且处于提取阶段时,游标具有以下功能,但可能受请求的选项进一步限制:
-
注意 如果尝试复制处于仅向前模式的临时表,则生成的游标将不会正确创建,并且会发生故障。 在具体化的临时表上复制游标仍然很安全。
要求
要求 | 值 |
---|---|
客户端 |
需要Windows Vista。 |
Server |
需要Windows Server 2008。 |
标头 |
在 Esent.h 中声明。 |
Library |
使用 ESENT.lib。 |
DLL |
需要ESENT.dll。 |
另请参阅
JET_ERR
JET_SESID
JET_OPENTEMPORARYTABLE
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetRollback
JetSeek
JetSetSystemParameter
信息参数
临时数据库参数