如何通过.NET代码压缩和修复ACCESS 2007数据库?

时间:2009-10-10 15:35:00

标签: database ms-access-2007 repair

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

有什么建议吗?

编辑:

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

这让我发疯了。

5 个答案:

答案 0 :(得分:6)

  

似乎像Office 12数据库引擎   没有任何文件   任何地方。

不完全正确。信息有限。

在MSDN上,请参阅:

Access 2007 Developer Reference

Microsoft Jet Replication Objects (JRO) Reference有一个分支,因此对于ACE,JRO(libraries comprising ADO classic之一)仍然得到官方支持(并且AFAIK仍然有效) 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数据库引擎都是在20世纪90年代开发的,当时专有格式风靡一时;我怀疑文档是出于商业原因被压制而且知识就丢失了。因此,当前可用的文档中存在许多漏洞,而大型漏洞则存在很多漏洞。通常,找出引擎如何工作的唯一方法是通过实际使用来发现它。存在的文档包含一些令人震惊的错误:今天我已经在SO上发布了几个示例,其中可能使用但虚构的功能(LIMIT TO nn ROWSCREATE TEMPORARY TABLE等)已在Access帮助中公布。注意事项。

答案 1 :(得分:3)

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

http://www.tolchin.net/KB/Lists/Posts/Post.aspx?ID=9

答案 2 :(得分:2)

仅仅是关于JRO的FYI,它不支持Access版本2007或更高版本的数据库文件。虽然此库中的CompactDatabase方法在使用ACE OLEDB Provider时似乎起作用,但它实际上会生成2002-2003(Jet 4.0)数据库文件。

BTW,引擎类型= 5是Jet 4.0,因此对于版本创建应该是一个死的赠品。

答案 3 :(得分: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";

       }
    }

// Hope that helps
// Wasif

答案 4 :(得分:1)

您不需要JRO。 JRO甚至不应该存在 - 它是ADODB的丑陋继子之一,因为微软试图用非原生抽象层ADO取代Access / Jet / ACE的原生DAO。 JRO可以为ADODB中没有的Jet特定功能提供支持。

如果您使用DAO,那么您已经具备了所有功能,它适用于您正在使用的Access版本支持的所有格式(因为DAO版本与您的Access版本同步,即,当数据库引擎得到增强时,有一个新版本的DAO可以使用它。)

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