4

我需要压缩和修复 Access 2007 .accdb 数据库文件。我知道 JRO.JetEngine 可以使用 .mdb 文件执行此操作,但我需要通过代码修复较新版本的 2007 格式。

有什么建议么?

编辑:

事情是这样的:我发现我可以使用 COM 对象库“Microsoft Office 12 Access Database Engine Object Library”并使用 DBEngine 类并调用它的 CompactDatabse 方法。但是我似乎没有提供数据库密码的地方;似乎 Office 12 数据库引擎在任何地方都没有任何文档。我找到了一些旧版本的 CompactDatabase 方法的文档,但这些对我一点帮助都没有。

这真让我抓狂。

4

5 回答 5

6

似乎 Office 12 数据库引擎在任何地方都没有任何文档。

不完全正确。可用信息有限。

在 MSDN 上,请参阅:

Access 2007 开发人员参考

Microsoft Jet Replication Objects (JRO) Reference有一个分支,因此 JRO(包含 ADO 经典的库之一)仍然受到官方支持(并且 AFAIK 仍然有效),例如 accdb 格式。CompactDatabase 方法采用两个参数,这两个参数都是 OLE DB 连接字符串。因此,提供数据库密码应该与常规连接没有什么不同,例如Jet OLEDB:Database Password在连接字符串中使用。请记住,对于 accdb 格式,您需要包含Jet OLEDB:Engine Type=5在连接字符串中,例如

Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=C:\MyDB.accdb;
Jet OLEDB:Database Password=MYPASSWORD;
Jet OLEDB:Engine Type=5

对于它的价值(事实证明并不多),ACE 引擎的有限文档可在Access 2007 的 Office 帮助中找到。

请记住,大多数 Access 数据库引擎是在 1990 年代开发的,当时专有格式风靡一时。我怀疑文档被出于商业原因而被压制,而知识只是丢失了。因此,当前可用的文档中存在许多漏洞,而且还有很多漏洞。通常,找出引擎如何工作的唯一方法是通过实际使用来发现它。确实存在的文档包含一些令人震惊的错误:今天我已经发布了几个关于 SO 的示例,其中可能使用但虚构的功能(LIMIT TO nn ROWSCREATE TEMPORARY TABLE等)已在 Access 帮助中宣传。买者自负。

于 2009-10-12T10:28:27.757 回答
5

我知道这是一个旧线程,但这对我有用(对于 VB.Net)。希望它可以帮助某人:

​添加对“Microsoft Office 12.0 Access 数据库引擎对象库”的引用

Dim dbe As New Microsoft.Office.Interop.Access.Dao.DBEngine

dbe.CompactDatabase("C:\folder\database.accdb",  "C:\folder\database_New.accdb", , , ";pwd=<database password>")
于 2013-10-04T18:22:13.410 回答
2

你不需要JRO。JRO 甚至不应该存在——它是 ADODB 的丑陋继子之一,它的出现是因为 Microsoft 错误地尝试用 ADO(一个非本地抽象层)替换 Access/Jet/ACE 的本地 DAO。JRO 可以为 ADODB 中不可用的 Jet 特定功能提供支持。

如果您改用 DAO,您将拥有所有功能,并且它适用于您正在使用的 Access 版本支持的所有格式(因为 DAO 版本与您的 Access 版本同步,也就是说,当db 引擎得到了增强,有一个新版本的 DAO 与之配套)。

因此,在 A2007 中,您只需使用 DAO 压缩方法(自 Access 2 以来,没有将修复操作作为单独的命令进行,并且仅当数据库引擎在压缩期间确定需要修复时才会进行修复)。如果您在 Access 外部工作,则需要使用与 ACE 兼容的 DAO 版本。如果您没有安装 A2007 并且单独安装了 ACE,那么您已经安装了该版本的 DAO。

于 2009-10-10T21:00:12.623 回答
2

只是关于 JRO 的仅供参考,它不支持 Access 2007 或更高版本的数据库文件。虽然该库中的 CompactDatabase 方法在使用 ACE OLEDB Provider 时似乎可以正常工作,但实际上它会生成一个 2002-2003 (Jet 4.0) 数据库文件。

顺便说一句,Engine Type = 5 是 Jet 4.0,因此对于创建的版本应该是一个死的赠品。

于 2011-04-01T13:24:49.850 回答
2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.IO;
using System.Data;
using Microsoft.Office.Interop.Access.Dao;
protected void btnSubmitDenim_Click(object sender, EventArgs e)
{
    try
       {
string oldFileName = HttpContext.Current.Server.MapPath(@"~/App_Data/MyDatainAccess2010.accdb");
string newFileName = HttpContext.Current.Server.MapPath(@"~/App_Data/Temp.accdb");

   // Obtain a reference to the Access 2010 introp DBEngine formally known as JetEngine
          
    DBEngine engine = (DBEngine)HttpContext.Current.Server.CreateObject("Dao.DBEngine.120");

           
  // Compact the database (saves the compacted version to newFileName)

    engine.CompactDatabase(oldFileName, newFileName);
          

            // Delete the original database
            File.Delete(oldFileName);

            // Move (rename) the temporary compacted database to
            // the original filename
            File.Move(newFileName, oldFileName);

            // The operation was successful
            lblResult.Text = "Database Compact completed";
       }
       catch
       {
           // We encountered an error
           lblResult.Text = "Process Failed";
          
       }
    }
于 2011-07-01T00:06:26.810 回答