用BCB進行多媒體數據庫開發時常會發現這樣一個現象,當你把一條記錄從表中刪除時,表檔 大小並沒有相應減小。這樣在進行多次插入刪除之後,表文件就會越來越龐大。之所以會出現這種現象,是因為TTable控件的 Delete Method並不真正從表中刪除記錄,而只是在記錄前加上一個刪除標志。在DBase和Foxpro中用Pack語句對表進行壓縮,但在TTable類中卻沒有相應的函數。其實在BDE的API函數中已經提供了DbiPackTable來對DBase或Foxpro表進行壓縮,但是這個函數對Paradox的表不起作用。要想給Paradox 表減肥得用DbiDoRestructure函數來完成,以下例程完成Pack Paradox表的功能。
//This function Pack the Paradox table. write by zodiac
void __fastcall TForm1::PackParadoxTable(hDBIDb hDB, AnsiString TblName)
{
//Paradox table use a quite different way to be packed than
//DBase or Foxpro table, it use the DBiDoRestructure not the
// DBiPackTable
DBIResult rslt;
CRTblDesc TblDesc;
//filled the structure CRTbiDesc with 0
memset((void *)&TblDesc,0,sizeof(CRTblDesc));
//copy the table name and type to the structure
lstrcpy(TblDesc.szTblName,TblName.c_str());
lstrcpy(TblDesc.szTblType,szPARADOX);
//set bPack to true to specify Pack Function
TblDesc.bPack=true;
//Pack the table
rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false);
if(rslt!=DBIERR_NONE)
Application->MessageBox("不能壓縮表","壓縮數據表出錯",MB_ICONERROR);
}
注意,在Restructure之前,表必須處於關閉狀態。以下例程調用PackParadoxTable.
void __fastcall TForm1::PackTable(AnsiString table_name)
{
//Pack the table
TTable *temp_table=new TTable(Form1);
temp_table->DatabaseName="YourDatabaseAlias";
temp_table->TableName=table_name;
temp_table->Exclusive=true;
temp_table->Open();
//get the Database Handle
hDBIDb hDB=temp_table->DBHandle;
temp_table->Close();
PackParadoxTable(hDB,table_name);
temp_table->Close();
temp_table->Free();
}
對Foxpro和DBase的Pack參見BDE API Help的DbiPackTable函數說明。