为啥我不能使用 VBscript 在 DAO.DBEngine.36 中使用“CompactDatabase”?
Posted
技术标签:
【中文标题】为啥我不能使用 VBscript 在 DAO.DBEngine.36 中使用“CompactDatabase”?【英文标题】:Why can't I use "CompactDatabase" in DAO.DBEngine.36 using VBscript?为什么我不能使用 VBscript 在 DAO.DBEngine.36 中使用“CompactDatabase”? 【发布时间】:2010-06-28 15:26:12 【问题描述】:我正在尝试制作一个压缩 MS Access 2007 数据库文件的小型 VBScript。
我的代码是:
Set acc2007 = CreateObject("DAO.DBEngine.36")
acc2007.CompactDatabase "C:\test.accdb", "C:\test2.accdb", Nothing, Nothing, ";pwd=test"
Set acc2007 = Nothing
当我在 32 位 cmd.exe 中使用“cscript test.vbs”运行三行代码时出现此错误:
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 已成功创建,因为我在该行没有收到任何错误。有什么问题?
【问题讨论】:
这就是为什么您应该首先检查 .ldb 文件(锁定文件)的代码,只有在没有找到时才继续。 我可以快乐地生活。 =) 干杯。 【参考方案1】: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 内容来简化此操作。
编辑:修改为检查锁定文件;如果发现什么都不做。
【讨论】:
我可以吻你,但我会通过握手来解决。 :) 非常感谢,这行得通! Access 2007 数据库已成功压缩,并且不会将格式更改为早期的 Access 数据库(因为它会使用其他方法),并且它还修复了状态不一致的数据库!对于阅读此内容但无法正常工作的任何人:如果您使用的是 64 位 Windows,请记住通过 32 位 cmd(在 SysWOW64 中找到)运行脚本。再次感谢 HansUp,这再合适不过了。【参考方案2】:上述命令不适用于 Access 2007 和 2010。
虽然可以追溯到 2000 年的所有 Windows 版本,甚至可能是 Windows 98,都附带了用于 Access 2007 及更高版本的 Jet 引擎副本,但如果您使用的是新格式 (accdb),那么您需要使用称为 ACE 的新版 Jet 引擎。请注意,此数据引擎默认未安装在 Windows 上,因此您必须从 Microsoft 下载。
当然,假设您已经安装了 Access 2007,那么您确实拥有新的 Jet 引擎 (ACE),并且您不需要下载和安装上述软件。
您需要的新对象名称是DAO.DBEngine.120
,因此请将您的代码更改为:
Set acc2007 = CreateObject("DAO.DBEngine.120")
请注意,64 位版本也可用。
【讨论】:
以上是关于为啥我不能使用 VBscript 在 DAO.DBEngine.36 中使用“CompactDatabase”?的主要内容,如果未能解决你的问题,请参考以下文章
DAO: db.OpenRecordSet("Table1", dbOpenTable, 0, dbPessimistic) - 第三个参数有啥作用?