以前使用 DAO 時,Microsoft 有提供 CompactDatabase Method 來壓縮 Microsoft Access 文件,RepairDatabase Method 來修復損壞的 Microsoft Access 文件,。可是自從 ADO 出來之後,好像忘了提供相對的壓縮及修復 Microsoft Access 文件的功能。
現在 Microsoft 發現了這個問題了,也提供了解決方法,不過有版本上的限制!限制說明如下:
ActiveX Data Objects (ADO), version 2.1 Microsoft OLE DB Provider for Jet, version 4.0 這是 Microsoft 提出的 ADO 的延伸功能:Microsoft Jet OLE DB Provider and Replication Objects (JRO)
這個功能在 JET OLE DB Provider version 4.0 (Msjetoledb40.dll) 及 JRO version 2.1 (Msjro.dll) 中第一次被提出! 這些必要的 DLL 文件在您安裝了 MDAC 2.1 之後就有了,您可以在以下的網頁中下載 MDAC 的最新版本!
Universal Data Access Web Site
在下載之前先到 VBE 界面中檢查一下,【引用】中的 Microsoft Jet and Replication Objects X.X library 如果已經是 2.1 以上的版本,您就可以不用下載了!
在您安裝了 MDAC 2.1 或以上的版本之後,您就可以使用 ADO 來壓縮或修復 Microsoft Access 文件,下面的步驟告訴您如何使用 CompactDatabase Method 來壓縮 Microsoft Access 文件:
1、新建一個新表單,選擇 VBE 中【引用】。 2、加入 Microsoft Jet and Replication Objects X.X library,其中 ( X.X 大於或等於 2.1 )。 3、在適當的地方加入以下的程序代碼,記得要修改 data source 的內容及目地文件的路徑:
Dim jro As jro.JetEngine Set jro = New jro.JetEngine jro.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\nwind2.mdb", _ '來源文件 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\abbc2.mdb;Jet OLEDB:Engine Type=4" '目的文件
在 DAO 3.60 之後,RepairDatabase Method 已經無法使用了,以上的程序代碼顯示了 ADO CompactDatabase Method 的用法,而它也取代了 DAO 3.5 時的 RepairDatabase method!
2、其他的壓縮修復數據庫的對象以及方法: http://support.microsoft.com/default.ASPx?scid=kb;zh-cn;240434 雖然有時可以成功地打開某些損壞的數據庫,但由於索引或表行已損壞,因此數據訪問速度要慢很多。可以運行 Microsoft Access 開發環境中的“修復和壓縮數據庫”實用程序來修復損壞的數據庫。編程時,您可以使用 Jet and Replication Objects (JRO) 的CompactDatabase 方法、Jet OLE DB 提供程序的IJetCompact::Compact 方法,或 Data Access Objects (DAO) 的CDaoDatabase::CompactDatabase 方法,來實現此目的。
function GetTempPathFileName():string; var SPath,SFile:array [0..254] of char; begin GetTempPath(254,SPath); GetTempFileName(SPath,'~SM',0,SFile); result:=SFile; DeleteFile(result); end;
function CompactDatabase(AFileName,APassWord:string):boolean; //壓縮與修復數據庫,覆蓋源文件 var STempFileName:string; vJE:OleVariant; begin STempFileName:=GetTempPathFileName; try vJE:=CreateOleObject('JRO.JetEngine'); vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]), format(SConnectionString,[STempFileName,APassWord])); result:=CopyFile(PChar(STempFileName),PChar(AFileName),false); DeleteFile(STempFileName); except result:=false; end; end;