我需要压缩并修复Access 2007 .accdb数据库文件。我知道JRO.JetEngine可以使用.mdb文件执行此操作,但我需要通过代码修复较新的版本2007格式。
有什么建议吗?
编辑:
这就是:我发现我可以使用COM对象库“Microsoft Office 12 Access数据库引擎对象库”并使用DBEngine类并调用其CompactDatabse方法。 但似乎没有地方可以提供数据库密码;好像Office 12数据库引擎在任何地方都没有任何文档。 我找到了旧版本的CompactDatabase方法的一些文档,但这些文档根本没有帮助我。
这让我发疯了。
答案 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 ROWS,CREATE 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>")
答案 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。