2009-10-10 34 views
4

我需要壓縮並修復Access 2007 .accdb數據庫文件。我知道JRO.JetEngine可以使用.mdb文件來做到這一點,但我需要通過代碼修復更新版本的2007格式。如何使用.NET代碼壓縮和修復ACCESS 2007數據庫?

有什麼建議嗎?

編輯:

這裏的事:我發現我可以使用COM對象庫「的Microsoft Office 12個Access數據庫引擎對象庫」,並使用用到dbengine類並調用其CompactDatabse方法。 但是,似乎沒有一個地方可以提供數據庫密碼;看起來像Office 12數據庫引擎沒有任何地方的任何文檔。 我發現了CompactDatabase方法的舊版本的一些文檔,但這些文檔根本沒有幫助我。

這讓我瘋狂。

回答

6

好像Office 12的數據庫引擎 沒有任何文件 任何地方。

不完全正確。有限的信息可用。

在MSDN,請參閱:

Access 2007 Developer Reference

沒有爲Microsoft Jet Replication Objects (JRO) Reference一個分支,所以JRO(該libraries comprising ADO classic之一)仍是官方支持(據我所知,並沒有仍然工作)的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數據庫引擎都是在20世紀90年代開發的,當時專有格式非常流行;由於商業原因,我懷疑文件被壓制,而且知識簡單地丟失了。所以目前可用的文檔中有很多漏洞,而且大的漏洞。通常,找出發動機如何工作的唯一方法是通過實際使用來發現它。確實存在的文檔包含一些令人震驚的錯誤:今天我已經發布了一些關於SO的例子,其中可能使用虛構的功能(LIMIT TO nn ROWS,CREATE TEMPORARY TABLE等)已經在Access幫助中被公佈。買者自負。

+0

我在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 2009-10-13 12:01:35

+0

@TheAgent:您需要在連接字符串中添加'Jet OLEDB:Engine Type = 5'。我已經更新了我的答案以涵蓋這一點,並以你爲例。 – onedaywhen 2009-10-13 15:16:44

+0

謝謝。奇蹟般有效。 – TheAgent 2009-10-18 12:19:00

1

你不需要JRO。 JRO甚至不應該存在 - 它是ADODB醜陋的繼子之一,因爲微軟錯誤地嘗試用ADO取代Access/Jet/ACE本地DAO,這是一種非本地抽象層。 JRO將爲ADODB中不提供的Jet特定功能提供支持。

如果您改用DAO,那麼您已經擁有所有功能,並且它適用於您使用的Access版本所支持的所有格式(因爲DAO版本與您的Access版本同步,是,當數據庫引擎增強時,有一個新版本的DAO去與它)。

因此,在A2007中,您只需使用DAO緊湊方法(自Access 2以來,沒有修復操作作爲單獨的命令,並且只有數據庫引擎在壓縮過程中確定需要修復時纔會發生修復)。如果您從外部訪問工作,則需要使用ACE兼容版本的DAO。如果您沒有安裝A2007並且已經獨立安裝了ACE,那麼隨該版本一起安裝了DAO。

+0

所以,這DAO的版本,我應該引用在Visual Studio中?我試過「Microsoft DAO 3.6 Object Library」,它無法識別數據庫格式,拋出一個異常:「無法識別的數據庫格式」C:\ Database.accdb'「 – TheAgent 2009-10-11 09:13:29

+1

對,DAO 3.6用於Jet 4.你想要的版本對於ACE,在MS的IDE參考文獻中顯示爲Microsoft Office 12.0 Access數據庫引擎對象庫,並且DLL是ACEDAO.DLL。 – 2009-10-11 20:08:22

2

只是關於JRO的FYI,它不支持Access版本2007或更高版本的數據庫文件。雖然此庫中的CompactDatabase方法在使用ACE OLEDB Provider時似乎可以正常工作,但它實際上會生成一個2002-2003(Jet 4.0)數據庫文件。

順便說一句,引擎類型= 5是Jet 4.0,所以對於創建的版本來說應該是一個死牌。

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 
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

相關問題