|
用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 ! I. U a7 n' M# ~$ L' ?
Delete
$ N' @, L7 m" i0 Z1 DMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox 3 x1 T5 l/ A3 M4 A ^7 F9 Q& K, L0 K1 p
表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。
2 K8 W/ e# C( F* h : k6 O+ S2 }/ n& L+ X
//This function Pack the Paradox table. write by zodiac
. B* v4 Q$ y/ L W# b! Uvoid __fastcall TForm1: ackParadoxTable(hDBIDb hDB, AnsiString TblName) $ H* [. n5 p+ O' [9 B0 x
{
8 o- A1 O& V( p. l1 P) N //Paradox table use a quite different way to be packed than + v V: B' V1 ]: i% H- J6 L( `* Q
//DBase or Foxpro table, it use the DBiDoRestructure not the # f9 I2 w3 k4 s: W: R6 C0 D
// DBiPackTable + P$ B' X/ |+ o6 B* X. i
DBIResult rslt; & z' W3 {* U9 d! V- q: m6 O
CRTblDesc TblDesc; - L; G$ S3 t! q: e9 q+ P( Z7 y
//filled the structure CRTbiDesc with 0 3 B; w4 P4 K: B0 ~4 E& R
memset((void *)&TblDesc,0,sizeof(CRTblDesc)); 6 U' V: o0 n8 k5 M) Q0 I0 B) M
//copy the table name and type to the structure ' n+ b" @& ?8 X- {& y* y
lstrcpy(TblDesc.szTblName,TblName.c_str()); 6 P% U2 Z# k4 U
lstrcpy(TblDesc.szTblType,szPARADOX);
% X+ S" a2 N+ g8 Z; `3 s //set bPack to true to specify Pack Function
# |( W, I2 H' _. T n- g5 N* Z% a TblDesc.bPack=true; 6 m- C7 _& o5 D9 k# m# i
//Pack the table 6 s: Q+ g+ g" }& z- h# F
rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false);
1 z" t! c: |4 y& F4 f if(rslt!=DBIERR_NONE)
+ Q: y. O" v3 r. k Application->MessageBox("不能压缩表", ! }* i$ q2 s7 W7 G: ^3 ~/ q! R7 z
"压缩数据表出错",MB_ICONERROR); ! a' y2 M4 e( T! n$ k6 I) h
}
. m0 W! W6 f# k4 o9 U注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable.
; s4 n, l! o; @ N# @
" r% H+ ?$ k, J& H1 L- c% Pvoid __fastcall TForm1: ackTable(AnsiString table_name) S3 r8 f |6 Y0 r9 f* o& _: Y
{ ( z9 ?: Q2 P5 ?
//Pack the table
# }6 i/ `1 I$ K; z; x TTable *temp_table=new TTable(Form1);
& }- L0 \' i0 U2 @6 C) @8 q: R z temp_table->DatabaseName="YourDatabaseAlias"; 1 `1 O) \# @6 D" C0 i
temp_table->TableName=table_name;
: w6 b6 I9 i" t# B- Y temp_table->Exclusive=true; - ]6 m1 ]/ p5 R: d
temp_table->Open();
; q; E* y1 }% g, ?7 k) \1 h1 s //get the Database Handle
, C$ I$ V o( T hDBIDb hDB=temp_table->DBHandle; & Q9 y# b& b' `" H
temp_table->Close(); ! `6 G0 e4 l; J, m! G
" ?5 `: C# h: w' b0 \ PackParadoxTable(hDB,table_name); 1 S/ f: m4 g& W; X5 Q! r
N& w0 E+ M, H5 t8 A temp_table->Close();
. [2 ?# I8 Q# _. l4 T3 V4 A9 { temp_table->Free(); 7 V) ^1 w" ]! J; }0 _' T- a+ t
} $ {+ W8 {, |- O( y1 O
2 f) C6 ?3 w2 x; M" Q2 ] C' ~3 h4 |! u
0 s4 s6 A/ [( G* v8 z+ S4 i+ q, g对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。 |