Метод DBEngine.CompactDatabase (DAO)

Область применения: Access 2013 | Access 2016

Копирует и сжимает закрытую базу данных, предоставляя возможность изменить ее версию, порядок сортировки и шифрование. (Только для рабочих областей Microsoft Access.)

Примечание.

Если используются зашифрованные связанные таблицы для действия, обновления и запросов SQL [например, оператор SQL UPDATE (CurrentDb.Execute "UPDATE...")], необходимо указать ключ шифрования. Кроме того, в связанных таблицах установлено ограничение в 19 знаков для ключа шифрования. См. раздел Зашифрованные связанные таблицы в конце этой статьи.

Синтаксис

expression . CompactDatabase(SrcName, DstName, DstLocale, Options, password)

выражение: выражение, возвращающее объект DBEngine.

Параметры

Имя

Обязательный/необязательный

Тип данных

Описание

SrcName

Обязательный

String

Определяет существующую закрытую базу данных. Это может быть полный путь и имя файла, например "C:\db1.mdb". Если имя файла содержит расширение, необходимо его указать. Если сеть поддерживает его, можно также указать сетевой путь, например "\\server1\share1\dir1\db1.mdb".

DstName

Обязательный

String

Имя файла (и путь) сжатой базы данных, которую вы создаете. Также можно указать сетевой путь. С помощью этого аргумента нельзя указать тот же файл базы данных, что и в аргументе SrcName.

DstLocale

Необязательный

Variant

Строковое выражение, указывающее порядок сортировки для создания DstName, как указанно в примечаниях.

  • Если этот аргумент опущен, языковой стандарт DstName совпадает с SrcName.

  • Вы также можете создать пароль для DstName путем объединения строки пароля (начиная с "; pwd=") с константой в аргументе DstLocale, например dbLangSpanish & "; pwd=NewPassword".

  • Если вы хотите использовать тот же DstLocale, что и SrcName (значение по умолчанию), но указать новый пароль, просто введите строку пароля для DstLocale: "; pwd=NewPassword"

Options

Необязательно

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