Почему я не могу использовать "CompactDatabase" в DAO.DBEngine.36, используя VBscript? - PullRequest
5 голосов
/ 28 июня 2010

Я пытаюсь создать небольшой 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 Access 2007, когда я открываю ее, дважды щелкнув по значку, набираю пароль «test» и затем я открываюсь нормально.Сверху написано «Access 2007», поэтому он имеет правильный формат.

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

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

Ответы [ 2 ]

6 голосов
/ 28 июня 2010

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.

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

3 голосов
/ 28 июня 2010

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...