Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't I use "CompactDatabase" in DAO.DBEngine.36 using VBscript?

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?

like image 929
Mike Avatar asked Jun 28 '10 15:06

Mike


Video Answer


2 Answers

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.

like image 109
HansUp Avatar answered Oct 07 '22 02:10

HansUp


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.

like image 24
Albert D. Kallal Avatar answered Oct 07 '22 03:10

Albert D. Kallal