JetAttachDatabase 函数

适用于: Windows |Windows Server

JetAttachDatabase 函数

JetAttachDatabase 函数附加用于数据库实例的数据库文件。 为了使用数据库,随后需要使用 JetOpenDatabase 打开该数据库。

    JET_ERR JET_API JetAttachDatabase(
      __in          JET_SESID sesid,
      __in          const tchar* szFilename,
      __in          JET_GRBIT grbit
    );

参数

sesid

用于 API 调用的数据库会话上下文。

szFilename

要附加的数据库的名称。

grbit

指定以下零个或多个选项的一组位。

含义

JET_bitDbDeleteCorruptIndexes

如果已设置 JET_paramEnableIndexChecking ,则将删除基于 Unicode 数据的所有索引。 有关更多详细信息,请参阅“备注”部分。

JET_bitDbDeleteUnicodeIndexes

无论JET_paramEnableIndexChecking的设置如何,都将删除基于 Unicode 数据的所有索引。 有关更多详细信息,请参阅“备注”部分。

JET_bitDbUpgrade

已过时。 请勿使用。

JET_bitDbReadOnly

防止修改数据库。

返回值

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

返回代码

说明

JET_errSuccess

操作已成功完成。

JET_errBackupInProgress

备份期间不允许附加数据库。

JET_errDatabaseFileReadOnly

szFilename 指定的数据库文件必须是可写的。 不得设置 Read-Only 属性,并且正在运行的进程必须有足够的权限写入文件。

JET_errDatabaseInUse

数据库文件已由另一个进程打开。

JET_errDatabaseInvalidPath

szFilename 中提供了无效的路径。 szFilename 必须为非 NULL,并引用有效路径。

JET_errDatabaseSharingViolation

数据库文件已由另一个会话附加。

JET_errFileAccessDenied

数据库引擎无法打开数据库文件。 该文件可能正在由另一个进程使用,或者调用方可能没有足够的权限打开该文件。

JET_errFileNotFound

szFilename 中给定的文件不存在。

JET_errPrimaryIndexCorrupted

主索引出错。 这可能是由于物理损坏 (,例如磁盘或内存损坏) 。 当附加上次在较旧操作系统上修改的数据库并且主索引位于包含 Unicode 数据的列上时,也可能返回它。 有关基于 Unicode 数据的索引的详细信息,请参阅备注。

JET_errSecondaryIndexCorrupted

辅助索引出现错误。 这可能是由于物理损坏 (,例如磁盘或内存损坏) 。 在较旧的操作系统上附加上次修改的数据库并且辅助索引位于包含 Unicode 数据的列上时,也可能返回该索引。 有关基于 Unicode 数据的索引的详细信息,请参阅备注。 使用以下命令通过脱机实用工具对数据库进行碎片整理时,将完全重新生成辅助索引: esentutl -d

JET_errTooManyAttachedDatabases

每个实例只能附加有限数量的数据库。 目前限制为每个实例七个数据库。

JET_wrnDatabaseAttached

一个非严重警告,指示此会话已附加数据库文件。

备注

调用 JetAttachDatabase 等效于调用 JetAttachDatabase2 并传递值 0,这意味着 cpgDatabaseSizeMax 参数没有限制。

附加可写数据库 (也就是说,如果未在 grbit 参数中指定JET_bitDbReadOnly) 将在操作系统级别以独占方式打开文件。 其他任何进程都无法打开该文件。 可以通过在只读模式下打开多个进程来附加单个数据库。

使用 JetDetachDatabase 或 JetDetachDatabase2 分离数据库文件。

索引检查参数

不同版本的 Windows 以不同的方式规范化 Unicode 文本。 这意味着在一个版本的 Windows 下生成的索引可能无法在其他版本上运行。

在 Windows Server 2003 之前,当操作系统版本更改 (包括安装 Service Pack) 时,基于 Unicode 数据的每个索引都可能处于损坏状态。

在 Windows Server 2003 及更高版本中创建的索引使用生成索引的 Unicode 规范化版本进行标记。 旧索引不包含版本信息。 大多数 Unicode 规范化更改包括添加新字符,以前未定义的码位现在定义和规范化方式不同。 因此,如果二进制数据存储在 Unicode 列中,它将在定义新码位时以不同的方式规范化。

从 Windows Server 2003 开始,ESE 数据库引擎跟踪包含未定义码位的 Unicode 索引条目。 当定义的 Unicode 字符集发生更改时,可以使用它们来修复索引。

这些参数控制当 ESE 数据库引擎附加到上次在不同版本的操作系统下使用的数据库时会发生什么情况。 操作系统版本在数据库标头中标记。

如果 JET_paramEnableIndexChecking 设置为 TRUE,并且数据库包含可能损坏的索引:

  • 如果 grbit 包含JET_bitDbDeleteCorruptIndexes,JetAttachDatabase 将删除可能损坏的索引

  • 如果 grbit 不包含JET_bitDbDeleteCorruptIndexes并且存在需要删除的索引,JetAttachDatabase将返回错误。

如果 JET_paramEnableIndexChecking 设置为 FALSE

  • JetAttachDatabase 将忽略可能损坏的索引,并返回JET_errSuccess (假设) 没有其他错误。

Windows Server 2003 及更高版本:如果未重置 JET_paramEnableIndexChecking ,则将使用内部修复表来修复索引条目。 这可能无法修复所有索引损坏,但对应用程序而言是透明的。

如果数据库附加为只读,则无法修复或删除索引。 在这种情况下,API 将改为返回错误,例如JET_errSecondaryIndexCorrupted或JET_errPrimaryIndexCorrupted。

要求

要求

客户端

需要 Windows Vista、Windows XP 或 Windows 2000 专业版。

服务器

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

标头

在 Esent.h 中声明。

Library

使用 ESENT.lib。

DLL

需要ESENT.dll。

Unicode

实现为 JetAddColumnW (Unicode) 和 JetAddColumnA (ANSI) 。

另请参阅

可扩展存储引擎文件
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JetAttachDatabase2
JetCreateDatabase
JetDetachDatabase
JetDetachDatabase2
JetOpenDatabase
JetSetSystemParameter