views:

69

answers:

2

Hello, 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?

+1  A: 

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.

HansUp
I could kiss you, though I will settle with shaking your hand. :) Thank you very much, this works! The Access 2007 database is compressed successfully and does not change format to a earlier Access database (as it will with other methods), AND it also repairs databases with a inconsistent state! To anyone that reads this but don't get it to work: If you are on a 64bit Windows remember to run the script through a 32bit cmd (found in SysWOW64). Thank you again HansUp, this couldn't be more helpful.
Mike
I'm pleased to accept your virtual handshake. :-) I'm curious about a couple points. Why use ACCDB format for your web site? Do you need ACCDB-specific features (attachments, multi-value fields)? Also, why use a database password on this one?
HansUp
A: 

The above command will not work for Access 2007, and 2010.

While all versions of windows going back to 2000, and perhaps even win98 ALL ship with a copy of the jet engine, for 2007 and beyond, if you going to use the NEW format (accdb), then you need to use the new version of JET called ACE. Note that this data engine is NOT installed by default for windows, so you have to download here:

http://www.microsoft.com/downloads/details.aspx?familyid=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en

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 + installed the above.

The new object name you need is:

DAO.DBEngine.120

So, change to:

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

Note that there is also a 64 bit version avaiable

Albert D. Kallal
Thank you as well.
Mike