|
用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 , P' f J* m3 R; D: h
Delete
: ]- R+ E8 N( s4 m& rMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox
' M: K: W; _# t& i5 j表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。
, k/ e' \- l: n1 W- M0 l$ T
/ c U @9 Z6 B t9 L) Q" @+ {//This function Pack the Paradox table. write by zodiac
1 x: S4 P" T mvoid __fastcall TForm1: ackParadoxTable(hDBIDb hDB, AnsiString TblName) 2 \& q' Y! W9 J4 }+ v. B+ q
{
/ X" f# F, s9 b" A d //Paradox table use a quite different way to be packed than
# d% O0 p, R- g9 H //DBase or Foxpro table, it use the DBiDoRestructure not the
; Z6 ]5 v, X& y1 T3 T# b# I // DBiPackTable 1 B+ B# c: x: j" N( h+ r$ m+ B
DBIResult rslt; 5 i- D% Q8 [; P6 C) c& C! R
CRTblDesc TblDesc;
/ n* u$ J* E2 K ]$ a z- [ //filled the structure CRTbiDesc with 0
* K0 `4 h9 ]% j% E5 ^4 r memset((void *)&TblDesc,0,sizeof(CRTblDesc));
4 \. F D. E) `6 u7 o //copy the table name and type to the structure ; g6 c$ E" e1 Z1 P8 v' ~# v
lstrcpy(TblDesc.szTblName,TblName.c_str());
) Y/ Z' N# H5 z* i7 Z3 Q8 K; L1 r, C lstrcpy(TblDesc.szTblType,szPARADOX); % C& k# b4 G w7 r
//set bPack to true to specify Pack Function " h; U* |# j) t
TblDesc.bPack=true; ) n" e8 K- A3 _6 D/ m+ }6 s! P
//Pack the table
/ N; b: C, P% M. O p. t rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false);
! h6 Z% b$ Z$ L0 v0 I7 t( Y if(rslt!=DBIERR_NONE) , Q% U f* l: d5 U/ |
Application->MessageBox("不能压缩表", ; Z& c6 ~2 t1 m) s
"压缩数据表出错",MB_ICONERROR); 0 L# D2 D2 A0 i, T( a
} ' S, s" N+ @1 ^$ Z3 P- a
注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. # L3 d. o7 f" m5 \, q
$ b" L3 Q5 Z) Y0 U' V0 zvoid __fastcall TForm1: ackTable(AnsiString table_name)
8 W+ n5 D; G3 Z{
8 e0 V% @' _, k% ]9 Q2 S //Pack the table
+ r: _) x" N; D8 R8 K# ~ TTable *temp_table=new TTable(Form1); & |) X; q/ R: u' j/ N q7 ^! A
temp_table->DatabaseName="YourDatabaseAlias"; 3 o* [8 _8 g* |2 q2 G
temp_table->TableName=table_name; ! p8 q7 v9 J# z
temp_table->Exclusive=true;
& A9 t& X2 l0 Q! D( y0 _ temp_table->Open(); ( s# p+ g" h( z
//get the Database Handle
" g* n+ E8 T" o hDBIDb hDB=temp_table->DBHandle; 0 R& [- i$ d, @4 W/ r0 |0 \% I
temp_table->Close();
3 K: i5 B1 s" p; c. \ , J! A" f1 t, L1 ~$ r T
PackParadoxTable(hDB,table_name); ! c) V$ ^2 [$ S1 c' f: N
b1 U# }5 I7 Y% e% }' K temp_table->Close(); ( @/ w3 H+ h8 g) u. t
temp_table->Free();
9 ?. `0 j8 O/ i K} D- l( y8 U* d7 |3 y: `3 ~
" a1 y5 H0 @ ~2 m4 ^) R
3 J5 e2 F8 h3 Q! ~对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。 |