【问题标题】:How do I compact and repair an ACCESS 2007 database by .NET code?如何通过 .NET 代码压缩和修复 ACCESS 2007 数据库?
【发布时间】:2009-10-10 15:34:59
【问题描述】:

我需要压缩和修复 Access 2007 .accdb 数据库文件。我知道 JRO.JetEngine 可以用 .mdb 文件做到这一点,但我需要通过代码修复较新版本的 2007 格式。

有什么建议吗?

编辑:

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

这快把我逼疯了。

【问题讨论】:

    标签: database ms-access-2007 repair


    【解决方案1】:

    看起来像 Of​​fice 12 数据库引擎 没有任何文件 任何地方。

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

    在 MSDN 上,请参阅:

    Access 2007 Developer Reference

    Microsoft Jet Replication Objects (JRO) Reference 有一个分支,因此 JRO(libraries comprising ADO classic 之一)仍然受到官方支持(并且 AFAIK 仍然有效),例如 ACE accdb 格式。 CompactDatabase method 有两个参数,这两个参数都是 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 引擎的有限文档可在Office Help for Access 2007 中找到。

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

    【讨论】:

    • 我将此代码与 JRO 一起使用,它会引发 COM 异常: Dim t_jetEngine As New JRO.JetEngine:t_jetEngine.CompactDatabase("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\ MyDB.accdb;Jet OLEDB:Database Password=MYPASSWORD", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\COMPACTED.accdb;") 例外是:“无效参数”我的代码有什么问题?
    • @TheAgent:您需要将“Jet OLEDB:Engine Type=5”添加到连接字符串中。我已经更新了我的答案以涵盖这一点,以你的为例。
    【解决方案2】:

    我知道这是一个旧线程,但这对我有用(对于 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>")
    

    【讨论】:

      【解决方案3】:

      您不需要 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。

      【讨论】:

      • 那么,我应该在 Visual Studio 中引用哪个版本的 DAO?我试过“Microsoft DAO 3.6 Object Library”,它不识别数据库格式,抛出异常:“Unrecognized database format 'C:\Database.accdb'”
      • 对,DAO 3.6 适用于 Jet 4。您需要 ACE 的版本,它在 MS 的 IDE 的引用中显示为 Microsoft Office 12.0 Access 数据库引擎对象库,而 DLL 是 ACEDAO.DLL。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:
        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";
                  
               }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-21
          • 2011-05-09
          • 1970-01-01
          • 2014-05-25
          • 1970-01-01
          • 2010-10-21
          • 1970-01-01
          • 2021-12-21
          相关资源
          最近更新 更多