Access 資料庫長期使用後會產生碎片、膨脹體積。定期壓縮可重組儲存空間、修復輕微損壞、提升效能。利用 ADO 的 JRO.JetEngine 物件可在 C++Builder 中以數行代碼完成壓縮,並支援密碼保護的資料庫。
#include "utilcls.h" // Variant 相關輔助
void CompactDatabase(AnsiString SrcFile, AnsiString SrcPwd,
AnsiString DstFile, AnsiString DstPwd)
{
// 建立連接字串
AnsiString ConnSrc = "Provider=Microsoft.Jet.OLEDB.4.0;"
"Data Source=" + SrcFile + ";"
"Jet OLEDB:Database Password=" + SrcPwd + ";";
AnsiString ConnDst = "Provider=Microsoft.Jet.OLEDB.4.0;"
"Data Source=" + DstFile + ";"
"Jet OLEDB:Database Password=" + DstPwd + ";";
// 建立 JetEngine 物件並呼叫 CompactDatabase 方法
Variant JetEngine = Variant::CreateObject("JRO.JetEngine");
JetEngine.OleProcedure("CompactDatabase", ConnSrc, ConnDst);
JetEngine.Clear(); // 釋放 COM 物件
}
// 使用範例
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Dir = ExtractFilePath(Application->ExeName);
AnsiString Src = Dir + "yhecdagl1.mdb";
AnsiString Dst = Dir + "yhecdagl2.mdb";
if (FileExists(Dst)) DeleteFile(Dst); // 目標檔必須不存在
CompactDatabase(Src, "yhecdagl", Dst, "yhecdagl2");
ShowMessage("壓縮完成!");
}
CompactDatabase 會建立新檔,若已存在會失敗。Jet OLEDB:Database Password 參數支援來源與目標不同密碼,實現壓縮時修改密碼。try/__except 或檢查 HRESULT,捕捉檔案鎖定、密碼錯誤、磁碟空間不足等異常。Access 2000 (Jet 4.0) 及更新版本(.mdb 格式)。對於 .accdb (Access 2007+),需改用 ACE OLEDB Provider 並參考 Microsoft.ACE.OLEDB.12.0,但壓縮邏輯類似。