Access (Jet) 資料庫長期使用後會產生碎片、空間浪費,甚至損壞。定期執行「壓縮與修復」可重組資料頁、重建索引、回收未使用空間,提升效能並降低損壞風險。本文示範在 C++Builder 中透過 ADO 呼叫 JRO.JetEngine 物件的 CompactDatabase 方法實現自動化壓縮,並支援密碼保護的資料庫。
#include <vcl.h>
#include <comobj.hpp> // Variant, CreateObject
#pragma hdrstop
//---------------------------------------------------------------------------
// 壓縮資料庫函式
// f1: 來源 .mdb 路徑 psw1: 來源密碼 (空字串表示無密碼)
// f2: 目標 .mdb 路徑 psw2: 目標密碼
//---------------------------------------------------------------------------
void CompactDatabase(const AnsiString& f1, const AnsiString& psw1,
const AnsiString& f2, const AnsiString& psw2)
{
// 建立連接字串:Microsoft.Jet.OLEDB.4.0 + 密碼參數
AnsiString Provider1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + f1 +
";Jet OLEDB:Database Password=" + psw1;
AnsiString Provider2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + f2 +
";Jet OLEDB:Database Password=" + psw2;
// 建立 JRO.JetEngine COM 物件
Variant JetEngine = Variant::CreateObject("JRO.JetEngine");
// 呼叫 CompactDatabase(SourceConnection, DestConnection)
JetEngine.OleProcedure("CompactDatabase", Provider1, Provider2);
// 釋放 COM 物件
JetEngine.Clear();
}
//---------------------------------------------------------------------------
// 範例:按鈕點擊觸發壓縮
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString srcFile = "yhecdagl1.mdb";
AnsiString srcPwd = "yhecdagl";
AnsiString destFile = "yhecdagl2.mdb";
AnsiString destPwd = "yhecdagl2";
AnsiString appDir = ExtractFilePath(Application->ExeName);
// 若目標檔已存在則刪除(CompactDatabase 要求目標不存在)
if (FileExists(appDir + destFile))
DeleteFile(appDir + destFile);
try {
CompactDatabase(appDir + srcFile, srcPwd, appDir + destFile, destPwd);
ShowMessage("資料庫壓縮完成!");
}
catch (Exception &e) {
ShowMessage("壓縮失敗:" + e.Message);
}
}
| 項目 | 說明 |
|---|---|
| Provider | 必須使用 Microsoft.Jet.OLEDB.4.0,支援 Access 97/2000/XP/2003 格式 (.mdb)。Access 2007+ (.accdb) 需改用 Microsoft.ACE.OLEDB.12.0。 |
| 密碼參數 | Jet OLEDB:Database Password=xxx 直接內嵌於連接字串,無需額外屬性。 |
| JRO.JetEngine | Jet Replication Objects 元件,隨 MDAC 2.1+ 安裝。若系統缺少需安裝 MDAC 或 Access Runtime。 |
| 目標檔案 | 必須不存在,否則 CompactDatabase 會報錯。範例中先檢查並刪除。 |
| 錯誤處理 | 建議包裹在 try/catch 中,常見錯誤:來源檔不存在、密碼錯誤、磁碟空間不足、檔案被獨佔開啟。 |
TTimer 或 Windows 排程器,於離峰時段自動執行。CopyFile),壓縮成功再替換,失敗可回滾。JRO.JetEngine 可能不可用,改用 DAO.DBEngine 或 Microsoft.ACE.OLEDB 的 CompactDatabase 方法。