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

C++Builder 實戰:Paradox 表壓縮與 DBF 記錄永久刪除

     編輯:關於C++

問題背景

TTable.Delete() 僅標記刪除旗標,不釋放磁盤空間。反覆增刪導致表文件膨脹。
DBase/FoxPro 可用 PACK 命令;Paradox 需 DbiDoRestructure;DBF 用 DbiPackTable。

Paradox 表壓縮實現


void __fastcall PackParadoxTable(hDBIDb hDB, AnsiString TblName) {
    DBIResult rslt;
    CRTblDesc TblDesc;
    memset(&TblDesc, 0, sizeof(TblDesc));
    lstrcpy(TblDesc.szTblName, TblName.c_str());
    lstrcpy(TblDesc.szTblType, szPARADOX);
    TblDesc.bPack = true; // 指定打包操作
    rslt = DbiDoRestructure(hDB, 1, &TblDesc, NULL, NULL, NULL, false);
    if (rslt != DBIERR_NONE)
        Application->MessageBox("不能壓縮表", "錯誤", MB_ICONERROR);
}

調用前必須關閉表:


void __fastcall PackTable(AnsiString table_name) {
    TTable* temp = new TTable(Form1);
    temp->DatabaseName = "YourDatabaseAlias";
    temp->TableName = table_name;
    temp->Exclusive = true; // 獨佔模式
    temp->Open();
    hDBIDb hDB = temp->DBHandle;
    temp->Close(); // 關閉後方可重組
    PackParadoxTable(hDB, table_name);
    delete temp;
}

DBF 永久刪除記錄


table->Close();
// 獨佔打開
for (;;) try { table->Exclusive = true; table->Open(); break; } catch (...) {}
if (DbiPackTable(table->DBHandle, table->Handle, NULL, szDBASE, true) != DBIERR_NONE)
    Application->MessageBox("不能刪除記錄", "錯誤", MB_ICONSTOP);

注意事項

  • 操作前備份數據。
  • 需獨佔訪問權限(Exclusive=true)。
  • BDE API 文檔參考 DbiPackTable、DbiDoRestructure 詳細參數說明。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved