I'm trying to make a small VBScript that compacts a MS Access 2007 database file.
The code I have is:
Set acc2007 = CreateObject("DAO.DBEngine.36")
acc2007.CompactDatabase "C:\test.accdb", "C:\test2.accdb", Nothing, Nothing, ";pwd=test"
Set acc2007 = Nothing
I'm getting this error when I run the three lines with "cscript test.vbs" from a 32-bit cmd.exe:
C:\test.vbs(10, 1) DAO.DbEngine: Unrecognized database format 'C:\test.accdb'.
The database was created with MS Access 2007, when I open it by double-clicking the icon I type the password "test" and then i opens normally. It says "Access 2007" at the top so it has the correct format.
Here's documentation of the function I'm trying to use: http://msdn.microsoft.com/en-us/library/bb220986.aspx
The object DAO.DBEngine.36 is created successfully since I'm not getting any errors on that line. What can be wrong?
DAO 3.6 does not support the new ACCDB database format. Try DAO.DBEngine.120
instead.
Here is an example which works on my system.
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
Note: I decided to make a backup of my database before compact. At the end, I remove the original (uncompacted) database and rename the compacted one to the original name. If you're not interested in that, you could simplify this by removing the objFSO
stuff.
Edit: Revised to check for lock file; if found do nothing.
The above command will not work for Access 2007 and 2010.
While all versions of Windows going back to 2000, and perhaps even Windows 98, ship with a copy of the Jet engine, for Access 2007 and beyond, if you're using the NEW format (accdb), then you need to use the new version of Jet engine called ACE. Note that this data engine is NOT installed by default on Windows, so you have to download it from Microsoft.
Of course assuming you already have Access 2007 installed, then you DO HAVE the new Jet engine (ACE) and you do NOT need to download and install the software mentioned above.
The new object name you need is DAO.DBEngine.120
, so change your code to:
Set acc2007 = CreateObject("DAO.DBEngine.120")
Note that a 64 bit version is also available.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With