|
用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 ( v! F6 P& g7 Y" |
Delete % S% U/ o9 `& O; o& ~' n9 |
Method并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox
* G. p5 Y' b6 B8 S表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 8 c) E1 `. o, a f
0 t. ~" s' n6 i//This function Pack the Paradox table. write by zodiac 9 v1 V9 z+ S: X& o
void __fastcall TForm1: ackParadoxTable(hDBIDb hDB, AnsiString TblName) 5 @; J) N9 h. K% n4 R, f
{
) {3 a/ H- ]5 y, j //Paradox table use a quite different way to be packed than
/ Y' M9 w. D. a1 R/ D% B5 ^ //DBase or Foxpro table, it use the DBiDoRestructure not the
/ v2 Z5 k1 x" A2 h // DBiPackTable
: L5 Y6 q5 C }2 ?. X5 B2 z DBIResult rslt;
0 A* z* E; `4 y9 f% O- ]4 g9 s3 } CRTblDesc TblDesc; " b0 ?+ T! J9 Z
//filled the structure CRTbiDesc with 0
1 j9 A0 H2 B2 X- g6 s memset((void *)&TblDesc,0,sizeof(CRTblDesc));
/ [# P8 w5 k2 T x //copy the table name and type to the structure
5 d6 W1 s+ o' l# z' h) w/ m( k lstrcpy(TblDesc.szTblName,TblName.c_str());
/ j8 C( A) q; ~. Z* F lstrcpy(TblDesc.szTblType,szPARADOX); C1 z4 t% _5 o' a# Y
//set bPack to true to specify Pack Function 3 B2 O; T" W3 G* L" j+ [
TblDesc.bPack=true; $ h$ L( F' i; k7 s/ a. \+ h
//Pack the table
4 g6 z! p/ i) k" q M rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false);
, o% P! o8 f( j6 f- M! t if(rslt!=DBIERR_NONE) ! R' V4 I/ `9 |6 t- s! R& w
Application->MessageBox("不能压缩表", " Q0 u% B1 C7 b" S' ^/ S
"压缩数据表出错",MB_ICONERROR); d3 z3 X. ^+ e; z; M0 o; P- {4 Q
}
. C# W% X7 Z1 U/ d, A( V注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. 2 ^( `. }# z' O7 R" @/ Y8 x1 O( P
- H8 e `1 \. i
void __fastcall TForm1: ackTable(AnsiString table_name)
7 v1 p4 |, F) b! K7 Q/ i{ . o0 {: W2 @7 {
//Pack the table
0 J$ P/ k7 d# j, `! ~ TTable *temp_table=new TTable(Form1); ! T) b6 l( S& C7 s$ j/ Y
temp_table->DatabaseName="YourDatabaseAlias";
! I4 i% c4 f9 e" K: u temp_table->TableName=table_name;
1 N" h$ E% f* k. C) W* C2 r( u temp_table->Exclusive=true;
4 p; g# c+ a9 m8 h8 V0 n temp_table->Open(); 8 {6 {! D/ a' X/ Q& r( `7 ~+ k
//get the Database Handle ) X# ]6 ^* J9 {8 R7 d
hDBIDb hDB=temp_table->DBHandle; 0 R. p, h( e$ P+ h( i; _! P7 f6 l& l. h8 D
temp_table->Close();
$ Y# [, B& |6 {3 x2 I/ Q4 d |7 l % X0 X- A3 Q4 c$ Z
PackParadoxTable(hDB,table_name); 6 I. {* y; T; \' l
& ^' ^1 A; i ^( w6 b! z temp_table->Close(); & E' ?% e$ s# H* Q6 U
temp_table->Free(); $ U* A* K% ^+ x0 [$ m" K
}
1 }+ L, s( J/ H
7 g2 m# a% y' f6 I
6 E* h$ y% w- _# R对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。 |