|
用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的
- g( C; b9 B9 ~ u/ \Delete
( ?& L7 K0 y6 d9 w1 I; i: `6 lMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox ; R% ^" R8 i0 k9 h* ]
表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。
: m# z u3 R6 `7 J, n8 T3 y 1 N% e0 l7 g) R3 O2 o
//This function Pack the Paradox table. write by zodiac
: r. {) d' k; M0 a; Jvoid __fastcall TForm1: ackParadoxTable(hDBIDb hDB, AnsiString TblName) ! q: U* ` ^, ~4 u% [
{ 3 {0 ^( \. F7 h+ o7 m4 |
//Paradox table use a quite different way to be packed than 9 _* r T$ Y, x/ Q+ }
//DBase or Foxpro table, it use the DBiDoRestructure not the 1 `" }) \& g, B, Z6 I
// DBiPackTable
0 q- i% {; n. q6 h DBIResult rslt;
+ `6 p1 ^3 b8 ]0 |" T/ ~4 T) c$ O CRTblDesc TblDesc; . r& V0 }/ ~; Z
//filled the structure CRTbiDesc with 0 7 G' Y; Z) v; G8 ]! Y6 I9 S
memset((void *)&TblDesc,0,sizeof(CRTblDesc)); & z% q5 o) Y* B5 a8 f2 m
//copy the table name and type to the structure
9 b* V+ q. W. m7 m% H lstrcpy(TblDesc.szTblName,TblName.c_str()); * q: h3 b* y$ D4 b) G
lstrcpy(TblDesc.szTblType,szPARADOX);
# F" n% F6 m7 }+ h% l //set bPack to true to specify Pack Function
: h( p, p4 h+ _, ~2 M6 M, @ TblDesc.bPack=true; 2 N5 a$ X, a* g/ h) v" y2 M& W( n5 \
//Pack the table
0 g% ?+ g+ Z7 B0 g! r R. a/ N1 ~8 z rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false);
) }( Z8 L5 s! E0 `, P6 p/ U( i if(rslt!=DBIERR_NONE)
! G, s x* m! E1 F8 Y Application->MessageBox("不能压缩表",
z/ y) m; U7 i2 u M+ X& A# G# b "压缩数据表出错",MB_ICONERROR); : L; J$ j4 P5 Y% J
}
# Q( u* k7 q( i3 G/ C7 ^9 E9 Q8 r注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable.
; N0 n* O. D! A4 I& S8 s" C( H
5 n% D$ c! D- ^8 b, |( l2 Xvoid __fastcall TForm1: ackTable(AnsiString table_name)
& j/ W: N) l( v% [; ^) R{ 5 R3 }: ], [0 W, K1 J! m# @. k, U+ `
//Pack the table - x; _; [, b; t: M& h
TTable *temp_table=new TTable(Form1);
4 ]9 a! ^7 v+ U Q$ n# i temp_table->DatabaseName="YourDatabaseAlias";
. h( @6 a/ G `! _" J0 t temp_table->TableName=table_name;
# O0 ?4 _, e' m3 b temp_table->Exclusive=true;
) O) L8 s' \/ G% q7 {8 y" p temp_table->Open();
0 e5 D6 _& x1 _ T: H, f //get the Database Handle 9 _" ?% }1 |8 N$ ]1 Q. M# A1 b
hDBIDb hDB=temp_table->DBHandle;
6 j/ d Y8 O; x, B) J8 d% M( Q temp_table->Close(); ; {/ T% l w& R& r5 U4 D) i2 G' B
9 G* ` N$ f$ M& n$ |" C4 A2 U PackParadoxTable(hDB,table_name); 7 |3 W, V% z0 C. Y4 h0 `* C) I
9 {$ t c W5 \9 H% D; U9 K9 W
temp_table->Close();
9 x h( P8 a0 I1 M( k temp_table->Free();
0 S. U( b- u/ Q: X, w} * X! P8 T8 X+ f+ a* i
& K _* P: |- j; U- f 5 K% u5 {: b* L4 H
对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。 |