|
用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的
7 r& N: K. h p }* oDelete
0 P# U! H5 I0 ~9 m7 o6 lMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox
0 H. G/ f5 r. @) y6 r% S表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 9 G, |& Z8 A* S6 c% P z
3 R7 r- w; y3 D: y9 u. Y9 m5 w. W5 w# l i//This function Pack the Paradox table. write by zodiac ' m0 a, y$ O8 f. h- m* ]+ Q7 v
void __fastcall TForm1: ackParadoxTable(hDBIDb hDB, AnsiString TblName) ' |8 @, A k) P
{ h' k! o+ x' @
//Paradox table use a quite different way to be packed than g6 l9 C# i" Y% l2 a. o
//DBase or Foxpro table, it use the DBiDoRestructure not the
! u Z2 U) W/ \1 R: a+ z) r // DBiPackTable
U; Q7 l( \! d. o; Y DBIResult rslt; " V; P1 ^. b/ B L/ {( s1 [
CRTblDesc TblDesc;
: h$ r' F. ^3 I. o) S //filled the structure CRTbiDesc with 0
- g# z. H7 o: ^' H* ] memset((void *)&TblDesc,0,sizeof(CRTblDesc)); 3 E* I1 x# g0 O9 C0 I, Z
//copy the table name and type to the structure ) m1 q' v6 D8 E) e% m
lstrcpy(TblDesc.szTblName,TblName.c_str());
: q: H+ `7 s: s7 D f0 _. Q" g lstrcpy(TblDesc.szTblType,szPARADOX); / y7 ^5 Q- M: D0 l, _
//set bPack to true to specify Pack Function
4 P3 L* x& I% C- U$ L; f9 L TblDesc.bPack=true;
. p O' a; K6 z: [ //Pack the table
- j7 C/ O+ Q) N. t5 {& J$ y8 {4 R f4 ` rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false);
( ?7 D9 K" R$ h+ C2 h$ M) [6 s, } if(rslt!=DBIERR_NONE) ! R7 e) Q% A& L5 z: y& J1 r
Application->MessageBox("不能压缩表",
' ~$ y: d+ L0 ~$ k4 P( a+ O "压缩数据表出错",MB_ICONERROR);
. g N* r/ [/ P3 d. j}
) W: Q7 {, g) ^. [! D, e. B/ c注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable.
( q* p) a9 p0 Y5 g6 U6 d- h 4 m6 A1 f& u3 }" z2 y# D- T
void __fastcall TForm1: ackTable(AnsiString table_name)
) `1 d3 a8 F5 |2 p- h! M{ ( n( [1 v. @( p* T+ ^
//Pack the table
! R4 C6 Y- U4 M3 B6 \ TTable *temp_table=new TTable(Form1); ! h3 G% `4 h4 [' v: m7 P
temp_table->DatabaseName="YourDatabaseAlias"; }8 b) X6 n; G! m. Z X
temp_table->TableName=table_name;
" ^/ s; U/ _( V- Y2 O temp_table->Exclusive=true; ! }5 Y1 X! A P$ y
temp_table->Open();
, S {- `- h' I3 | //get the Database Handle
' g$ |: N ? D" b6 S hDBIDb hDB=temp_table->DBHandle; 3 t2 [ d& K! {
temp_table->Close(); 0 l/ u( k8 f7 ^, C9 M8 B7 t4 e: _, O
5 ]. {4 j3 {$ l6 T+ K PackParadoxTable(hDB,table_name); - e" k, h6 P @9 i( W
# I+ ^" K8 K$ m4 U' G, \( }4 |3 f temp_table->Close();
3 e: ^2 g9 X: G. `. f$ f temp_table->Free();
1 L, {) s/ v/ |$ N, a}
! t3 g( U K! S0 Q & F3 i1 h; L, l5 Y4 ~1 }
+ T+ N, v7 t$ p. @" B' d
对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。 |