DBEngine.CompactDatabase 方法 (DAO)
适用于:Access 2013 | Access 2016
复制并压缩关闭的数据库,使您可以选择更改其版本、整理顺序和加密设置。 (仅适用于 Microsoft Access 工作区。
注意
使用加密的链接表来执行操作、更新和 SQL 查询 [例如 SQL UPDATE 语句 (CurrentDb.Execute "UPDATE...")] 时,你必须提供加密密钥。 此外,链接表对加密密钥有 19 字符的限制。 请参阅本主题结尾的加密的链接表部分。
语法
表达式 。CompactDatabase (SrcName、 DstName、 DstLocale、 Options、 password)
expression一个返回 DBEngine 对象的表达式。
参数
名称 |
必需/可选 |
数据类型 |
说明 |
---|---|---|---|
SrcName |
必需 |
String |
识别现有的已关闭数据库。 它可以是完整路径和文件名,例如“C:\db1.mdb”。 如果文件名具有扩展名,则必须指定扩展名。 如果网络支持的话,还可以指定网络路径,例如“\\server1\share1\dir1\db1.mdb”。 |
DstName |
必需 |
String |
您要创建的压缩数据库的文件名(和路径)。 还可以指定网络路径。 不能使用此参数来指定与 SrcName 相同的数据库文件。 |
DstLocale |
可选 |
Variant |
指定用于创建 DstName 整理顺序的字符串表达式,如“备注”中所指定的。
|
选项 |
可选 |
Variant |
可选。 一个常量或常量的组合,用于指示一个或多个选项(根据“说明”中的指定)。 可通过对相应的常量求和来组合选项。 |
password |
可选 |
Variant |
包含加密密钥的字符串表达式(若数据库加密)。 字符串“;pwd=“ 必须位于实际密码之前。 如果在 DstLocale 中包括密码设置,则忽略此设置。 注释:这是已弃用的参数, 不支持 .ACCDB 格式。 要加密 .ACCDB 文件,请使用 "pwd =" 选项字符串。 使用混合大小写字母、数字和符号的强密码。 弱密码不混合使用这些元素。 例如,强密码:Y6dh!et5。 弱密码:House27。 请使用可以记住的强密码,这样就不必记录密码了。 |
说明
可以使用 DstLocale 参数的下列常量之一来指定用于文本字符串比较的CollatingOrder属性。
常量 |
整理顺序 |
---|---|
dbLangGeneral |
英语、德语、法语、葡萄牙语、意大利语和现代西班牙语 |
dbLangArabic |
阿拉伯语 |
dbLangChineseSimplified |
简体中文 |
dbLangChineseTraditional |
繁体中文 |
dbLangCyrillic |
俄语 |
dbLangCzech |
捷克语 |
dbLangDutch |
荷兰语 |
dbLangGreek |
希腊语 |
dbLangHebrew |
希伯来语 |
dbLangHungarian |
匈牙利语 |
dbLangIcelandic |
冰岛语 |
dbLangJapanese |
日语 |
dbLangKorean |
朝鲜语 |
dbLangNordic |
北欧语言(仅适用于 Microsoft Jet 数据库引擎 1.0 版) |
dbLangNorwDan |
挪威语和丹麦语 |
dbLangPolish |
波兰语 |
dbLangSlovenian |
斯洛文尼亚语 |
dbLangSpanish |
传统西班牙语 |
dbLangSwedFin |
瑞典语和芬兰语 |
dbLangThai |
泰语 |
dbLangTurkish |
土耳其语 |
可以在 options 参数中使用以下常量之一来指定在压缩数据库时对数据库进行加密还是解密。
注意
常量 dbEncrypt 和 dbDecrypt 已弃用,不支持 .ACCDB 文件格式。
常量 |
说明 |
---|---|
dbEncrypt |
压缩时加密数据库。 |
dbDecrypt |
压缩时解密数据库。 |
如果省略加密常量或同时包括 dbDecrypt 和 dbEncrypt,DstName 将与 SrcName 具有相同的加密。
可以在 options 参数中使用下列常量之一来指定压缩数据库的数据格式的版本。 此常量仅影响 DstName 的数据格式的版本,而不会影响任何 Microsoft Access 定义的对象(例如窗体和报表)的版本。
常量 |
说明 |
---|---|
dbVersion10 |
在压缩时创建一个使用 Microsoft Jet 数据库引擎 1.0 版文件格式的数据库。 |
dbVersion11 |
在压缩时创建一个使用 Microsoft Jet 数据库引擎 1.1 版文件格式的数据库。 |
dbVersion20 |
在压缩时创建一个使用 Microsoft Jet 数据库引擎 2.0 版文件格式的数据库。 |
dbVersion30 |
在压缩时创建一个使用 Microsoft Jet 数据库引擎 3.0 版文件格式的数据库(与 3.5 版兼容)。 |
dbVersion40 |
在压缩时创建一个使用 Microsoft Jet 数据库引擎 4.0 版文件格式的数据库。 |
dbVersion120 |
创建一个压缩时使用 Microsoft Access 数据库引擎版本 12.0 文件格式的数据库。 |
只能指定一个版本常量。 如果省略版本常量,DstName 将与 SrcName 具有相同的版本。 只能将 DstName 压缩为等于或高于 SrcName 版本的版本。
更改数据库中的数据时,数据库文件中会产生碎片,并使用多于所需量的磁盘空间。 您可以定期使用 CompactDatabase 方法来压缩数据库,对数据库文件进行碎片整理。 压缩的数据库通常更小且运行速度更快。 在复制和压缩数据库时,还可以更改整理顺序、加密或数据格式的版本。
压缩 SrcName 之前,必须关闭它。 在多用户环境中,在你压缩 SrcName 时,其他用户不能打开它。 如果 SrcName 未关闭或者不能独占使用,将会发生错误。
由于 CompactDatabase 会创建数据库的副本,因此您必须为原始数据库和复制数据库提供足够的磁盘空间。 如果没有足够的可用磁盘空间,压缩操作将失败。 DstName 复制数据库不必与 SrcName 位于同一个磁盘上。 在成功压缩数据库之后,可以删除 SrcName 文件,并将压缩的 DstName 文件重命名为原始文件名。
CompactDatabase 方法将所有数据和安全权限设置从由 SrcName 指定的数据库复制到由 DstName 指定的数据库。
注意
因为CompactDatabase方法不能转换 Microsoft Access 对象,所以请不要使用CompactDatabase来转换包含此类对象的数据库。
加密的链接表
加密密码取决于正在使用的数据库的文件格式。 如果使用 Access 2003 (.mdb) 或早期数据库,会有一个密码来保护数据库,另一个单独密码来加密数据库。 对于 Access 2007 (.accdb) 和更高版本 (.mdb) 数据库,唯一选项就是使用同一个密码来加密和保护数据库,因为拥有两个单独密码的选项已删除。
注意
对于 Access 2007 (.accdb) 数据库,密码就是加密密钥
可以使用以下示例 VBA 代码作为命令按钮:
Private Sub Command0_Click()
Dim strSourcePath As String
Dim strDestPath As String
strSourcePath = "<path>\sourceDb.accdb"
strDestPath = "<path>\destDb.accdb"
DBEngine.CompactDatabase strSourcePath, strDestPath, dbLangGeneral & ";pwd=Access", dbVersion120, ";pwd=Access"
Set CurrentDatabase = CurrentDb
Set LinkedTableDef = CurrentDatabase.CreateTableDef
("My Linked Table")
LinkedTableDef.Connect = "MS Access;pwd=Access";database=" & strDestPath
LinkedTableDef.RefreshLink
MsgBox "Finished"
End Sub
下面的代码示例显示如何借助密码(加密密钥) 使用 CompactDatabase,然后将它链接到该压缩数据库中的一个表。 请注意必须提供密码。
Private Sub CompactAndLink_Click()
Dim strSourcePath As String
Dim strDestPath As String
Dim strSourceTableName As String
Dim strDestTableName As String
Dim tdf As TableDef
strSourcePath = "<path>\<database>.accdb"
strDestPath = "<path>\<database>.accdb"
strSourceTableName = "<table name in destination database>"
strDestTableName = "<linked table name>"
' Compact source database into new destination database with encrypted password
DBEngine.CompactDatabase strSourcePath, strDestPath, dbLangGeneral & ";pwd=Access", dbVersion120, ";pwd=Access"
' Link to one of the tables in the destination database
' Password must be provided in the Connect property
Set CurrentDatabase = CurrentDb
Set tdf = CurrentDatabase.CreateTableDef(strDestTableName)
With tdf
.Connect = ";pwd=Access" & ";DATABASE=" & strDestPath
.SourceTableName = strSourceTableName
End With
CurrentDatabase.TableDefs.Append tdf
MsgBox "Database compacted and encrypted password applied. Link to table also completed."
End Sub