首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

使用 ADO (JRO.JetEngine) 壓縮與修復 Access 2000 資料庫

     編輯:關於C++

應用場景

Access (Jet) 資料庫長期使用後會產生碎片、空間浪費,甚至損壞。定期執行「壓縮與修復」可重組資料頁、重建索引、回收未使用空間,提升效能並降低損壞風險。本文示範在 C++Builder 中透過 ADO 呼叫 JRO.JetEngine 物件的 CompactDatabase 方法實現自動化壓縮,並支援密碼保護的資料庫。

核心程式碼 (C++Builder)

#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.JetEngineJet Replication Objects 元件,隨 MDAC 2.1+ 安裝。若系統缺少需安裝 MDAC 或 Access Runtime。
目標檔案必須不存在,否則 CompactDatabase 會報錯。範例中先檢查並刪除。
錯誤處理建議包裹在 try/catch 中,常見錯誤:來源檔不存在、密碼錯誤、磁碟空間不足、檔案被獨佔開啟。

進階應用:定期自動壓縮

  • 結合 TTimer 或 Windows 排程器,於離峰時段自動執行。
  • 壓縮前先備份原檔(CopyFile),壓縮成功再替換,失敗可回滾。
  • 記錄壓縮前後檔案大小、耗時、錯誤日誌,供維運監控。

注意事項

  1. 獨佔存取:壓縮期間來源資料庫不能有其他連線開啟(含自身應用程式的 ADOConnection)。
  2. 版本相容:目標檔案格式與來源相同;若需轉換格式(如 2000 → 2002/2003),需另行處理。
  3. 大型資料庫:壓縮可能耗時數分鐘,建議在背景執行緒進行並顯示進度。
  4. 64-bit 程式:若編譯為 64-bit,需安裝 64-bit 版 ACE/OLEDB Provider,且 JRO.JetEngine 可能不可用,改用 DAO.DBEngine 或 Microsoft.ACE.OLEDB 的 CompactDatabase 方法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved