Я пытаюсь сделать маленький 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 создается успешно, так как я не получаю ошибок на той строке. Что может быть неправильным?
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.
Правка : исправлено для проверки файла блокировки; если найден, ничего не делайте.
Приведенная выше команда не будет работать для 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-битная версия.