MyTetra Share
Делитесь знаниями!
Почему я не могу использовать "CompactDatabase" в DAO.DBEngine.36 с помощью VBscript?
Время создания: 14.10.2019 06:44
Текстовые метки: VBA_Access, Compress
Раздел: !Закладки - VBA - Access - Compress
Запись: xintrea/mytetra_db_adgaver_new/master/base/1571024640ms1e9evg59/text.html на raw.githubusercontent.com

'Работает из Excel

'=====================================================================

Sub test_SjatBazuDannihAccess()

strPathDb = Range("strPathDb").Value 'путь к основной базе

Call SjatBazuDannihAccess(strPathDb)

End Sub

'---------------------------------------------------------------------

Sub SjatBazuDannihAccess(ByVal strPathDb As String)

'http://qaru.site/questions/1048800/why-cant-i-use-compactdatabase-in-daodbengine36-using-vbscript

Dim objFSO

Dim objEngine


Dim strDstName

Dim strPassword 'strPassword = "" '"foo"


strPathFolderTemp = w_OS.fun_strPathFolderTemp() 'папка для создания временной базы

strDstName = strPathFolderTemp & "MyDatabaseTemporary.accdb"


'определить имя файла+расширение

Dim strBackup As String, strPath As String, strName As String, strExt As String

strPath = m_CDC_BUMPER.FnStrPathInFullPath(strPathDb)

strName = m_CDC_BUMPER.FnStrNameInFullPath(strPathDb)

strExt = m_CDC_BUMPER.FnStrExtInFullPath(strPathDb)

strBackup = strPath & "Backup_" & strName '& strExt



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

'Set acc2007 = 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 strPathDb, strBackup

''dbVersion120 = 128

objEngine.CompactDatabase strPathDb, strDstName, , 128, ""

'";pwd=" & strPassword

objFSO.DeleteFile strPathDb

objFSO.MoveFile strDstName, strPathDb

'End If 'LckFile

End Sub

'=====================================================================


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

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

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

+5

database ms-access vbscript compression

Mike 28 июн. '10 в 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

HansUp 28 июн. '10 в 15:42

источник поделиться

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

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

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

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

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


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

 
MyTetra Share v.0.59
Яндекс индекс цитирования