Почему я не могу использовать “CompactDatabase” в ДАО DBENGINE.36 с помощью VBscript?

Я пытаюсь сделать маленький VBScript, который уплотняет файл базы данных MS Access 2007.

Код, который я имею:

Set acc2007 = CreateObject("DAO.DBEngine.36")
acc2007.CompactDatabase "C:\test.accdb", "C:\test2.accdb", Nothing, Nothing, ";pwd=test"
Set acc2007 = Nothing

Я получаю эту ошибку, когда я выполняю эти три строки с "cscript test.vbs" из 32-разрядного cmd.exe:

C:\test.vbs(10, 1) DAO.DbEngine: Нераспознанный формат базы данных 'C:\test.accdb'.

База данных была создана с Доступом MS 2007, когда я открываю его путем двойного щелчка по значку, я ввожу пароль "тест", и затем я обычно открываюсь. Это говорит "Доступ 2007" наверху, таким образом, это имеет правильный формат.

Вот документация функции, которую я пытаюсь использовать: http://msdn.microsoft.com/en-us/library/bb220986.aspx

Объектный ДАО DBENGINE.36 создается успешно, так как я не получаю ошибок на той строке. Что может быть неправильным?

5
задан Mike 28 June 2010 в 15:26
поделиться

2 ответа

DAO 3.6 не поддерживает новый формат базы данных ACCDB. Попробуйте вместо этого DAO.DBEngine.120.

Вот пример, который работает в моей системе.

Dim objFSO
Dim objEngine
Dim strLckFile
Dim strSrcName
Dim strDstName
Dim strPassword

strLckFile =  "C:\Access\webforums\foo.laccdb"
strSrcName =  "C:\Access\webforums\foo.accdb"
strDstName =  "C:\Access\webforums\compacted.accdb"
strBackup = "C:\Access\webforums\foobackup.accdb"
strPassword = "foo"

Set objEngine = CreateObject("DAO.DBEngine.120")

Set objFSO = CreateObject("Scripting.FileSystemObject")
If Not (objFSO.FileExists(strLckFile)) Then
    If (objFSO.FileExists(strBackup)) Then
        objFSO.DeleteFile strBackup
    End If
    If (objFSO.FileExists(strDstName)) Then
        objFSO.DeleteFile strDstName
    End If
    objFSO.CopyFile strSrcName, strBackup

    ''dbVersion120 = 128 
    objEngine.CompactDatabase strSrcName, strDstName, , 128, ";pwd=" & strPassword

    objFSO.DeleteFile strSrcName
    objFSO.MoveFile strDstName, strSrcName
End If 'LckFile

Примечание : я решил сделать резервную копию своей базы данных перед сжатием. В конце я удаляю исходную (несжатую) базу данных и переименовываю сжатую в исходное имя. Если вас это не интересует, вы можете упростить это, удалив материал objFSO.

Правка : исправлено для проверки файла блокировки; если найден, ничего не делайте.

6
ответ дан 14 December 2019 в 01:01
поделиться

Приведенная выше команда не будет работать для Access 2007 и 2010.

Хотя все версии Windows, начиная с 2000 года, и, возможно, даже Windows 98 поставляются с копией движка Jet, для Access 2007 и последующих версий, если вы используете НОВЫЙ формат (accdb), вам необходимо использовать новую версию Jet Engine под названием ACE. Обратите внимание, что этот механизм обработки данных НЕ установлен по умолчанию в Windows, поэтому его необходимо загрузить с Microsoft .

Конечно, если у вас уже установлен Access 2007, тогда у вас ЕСТЬ новый движок Jet (ACE), и вам НЕ нужно загружать и устанавливать программное обеспечение, упомянутое выше.

Новое имя объекта, которое вам нужно, - DAO.DBEngine.120 , поэтому измените свой код на:

Set acc2007 = CreateObject("DAO.DBEngine.120") 

Обратите внимание, что также доступна 64-битная версия.

3
ответ дан 14 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: