|
用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 ) Z/ S% h2 }% D, n' h$ ]
Delete
! m. s# Y4 H tMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox
7 w4 o# i; ?( N表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 / T* x% |( C( `3 {
4 W* A# |7 R' a& F- ~
//This function Pack the Paradox table. write by zodiac
/ A5 ]" v$ _# Y. j1 }- Bvoid __fastcall TForm1: ackParadoxTable(hDBIDb hDB, AnsiString TblName) 2 t, z3 T+ [7 v8 q. e& s
{
: D0 z7 { h5 R2 }7 \ //Paradox table use a quite different way to be packed than , O2 V6 u" l/ Q( R0 L1 B) E) C8 U
//DBase or Foxpro table, it use the DBiDoRestructure not the $ N! m+ _$ ^) E; Y4 \1 u
// DBiPackTable ( ?4 {: `: E0 E* I; j; c7 I1 n0 E# i
DBIResult rslt;
( ~$ m0 z3 M" A* K. w0 | CRTblDesc TblDesc;
5 K" {3 r9 p4 k //filled the structure CRTbiDesc with 0
V i6 m$ {" M& c memset((void *)&TblDesc,0,sizeof(CRTblDesc));
# Y) X5 L$ z3 \ //copy the table name and type to the structure ! Q0 u4 A% f: E5 i5 S
lstrcpy(TblDesc.szTblName,TblName.c_str()); . }" q2 T: g/ ^1 Q* H) ^
lstrcpy(TblDesc.szTblType,szPARADOX);
/ r7 O7 g, |, _7 P0 G7 g //set bPack to true to specify Pack Function 7 g# o; J. ^7 m& K0 S Z6 T: F
TblDesc.bPack=true; - l5 W8 D4 Q. k6 L7 m& p# o
//Pack the table
. O$ A: K- Y, e$ J; H% A rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); $ t. L, ^% Y- O M
if(rslt!=DBIERR_NONE)
: a0 _ O/ A0 `/ u% X9 q, A Application->MessageBox("不能压缩表", ! x# |7 R o+ x8 y+ ~( V4 T8 g
"压缩数据表出错",MB_ICONERROR); & b0 B; K1 g2 M7 e$ v" U/ W/ }
} ! ^# \; j. \+ O, ~
注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. 4 |6 O6 A0 j( Y% r; E8 v6 b
$ [, c6 D L9 y1 e9 Z, {) J
void __fastcall TForm1: ackTable(AnsiString table_name)
8 [3 i$ s* M2 N7 A" J, u{
" ~7 k: U+ S7 f- } //Pack the table % } N7 F# }( Z# E! D: d
TTable *temp_table=new TTable(Form1);
# b }2 c) }9 }$ Q' K' v temp_table->DatabaseName="YourDatabaseAlias";
/ u6 P" w" Q3 {" W temp_table->TableName=table_name;
9 c I% b' f8 L! E% ? |2 L& A4 l temp_table->Exclusive=true;
' C( W7 B' y( X3 A, N9 ^# r temp_table->Open();
& M* g4 D. F5 b5 d8 U* S2 T+ ? //get the Database Handle
/ ~0 b! j& m: h: e% K8 ^" Z- s hDBIDb hDB=temp_table->DBHandle; " K# B* n# k& F+ B* k3 }" W4 b0 F
temp_table->Close();
" `; I7 f) K7 C9 k0 T2 M ; ?6 }9 |3 }% m! O0 e
PackParadoxTable(hDB,table_name);
! O3 c8 @% b+ z( r 3 w7 K! w5 q( {/ }& ?2 A2 ^
temp_table->Close(); ( j' }% z+ x# }( w
temp_table->Free(); 3 I" J {0 E) Q& X2 g) i8 L
} ' E( |9 e" s! p& A7 A3 s4 R
- J6 T' \# Z b: m/ s5 x & Y6 |* V, ?6 `" s/ b/ l S; ?' e
对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。 |