|
用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 3 _/ {6 m- F+ `1 P) a" B7 Q
Delete 4 X% r' P0 r+ v5 r$ g7 A- V6 ^
Method并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox 7 g. n5 S A0 q4 T7 U
表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 + G0 N2 Y% i H8 Q- W
8 W* b) Q" s' [8 j* x! |: r
//This function Pack the Paradox table. write by zodiac
& `7 {8 c, k- }$ Q+ p2 p: z1 k1 ?void __fastcall TForm1: ackParadoxTable(hDBIDb hDB, AnsiString TblName)
# c3 Y7 s3 N/ ~- O; L+ S3 _{ 2 }7 l- c& O9 [) z
//Paradox table use a quite different way to be packed than ) A* M/ N3 u' j g; E) C
//DBase or Foxpro table, it use the DBiDoRestructure not the ! _) l+ B4 K ~ I
// DBiPackTable 0 u" X& `0 g( U0 n5 y
DBIResult rslt; ! h6 }, G% p7 R3 c2 v# L3 v- y
CRTblDesc TblDesc;
. w- o4 _9 B: ]8 m7 q# a //filled the structure CRTbiDesc with 0 - |9 g' s2 T7 E! V: m+ A- u* H. z
memset((void *)&TblDesc,0,sizeof(CRTblDesc));
: ~& E \2 P& O+ W4 g- N& B1 \1 T //copy the table name and type to the structure
, F1 h6 l" P6 Z. j0 t2 J2 W+ L [ lstrcpy(TblDesc.szTblName,TblName.c_str()); ; ?6 n3 R$ X1 Y9 V: m. [6 t, x7 _ h
lstrcpy(TblDesc.szTblType,szPARADOX);
t* T2 w# z0 d# F) J/ D/ \ //set bPack to true to specify Pack Function
' T: N# T: R& Z8 T# C) F) x5 u TblDesc.bPack=true; ' {0 }2 |5 n1 b3 y3 {
//Pack the table ( I7 ^1 W7 X) F
rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false);
0 r) g' P' X+ U+ g5 Y if(rslt!=DBIERR_NONE) / H4 z8 D, u i2 h# X9 U+ N2 h% |
Application->MessageBox("不能压缩表",
$ H; y x" N3 R5 s3 U& q+ b "压缩数据表出错",MB_ICONERROR); 1 l. J; v; o, p
} 5 @* Y; G, S4 W9 F' v8 | F; c
注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable.
$ C5 m% ]0 x( o6 A
$ A3 E6 p R/ L0 [: X$ G# n, {void __fastcall TForm1: ackTable(AnsiString table_name)
# `; {3 V. X `4 p+ j- y3 u) R: j{ , ]2 |. B7 Y% e- {4 p
//Pack the table
8 E4 n8 L. W) v" m/ ^% G p TTable *temp_table=new TTable(Form1); $ v+ z2 Z% e$ _7 _% s
temp_table->DatabaseName="YourDatabaseAlias";
6 W% H) \: p; S$ I% N/ p temp_table->TableName=table_name; 3 w' Q. b% n/ j; _9 @ u0 l
temp_table->Exclusive=true;
5 |! _1 `9 ]/ E% n" O, K temp_table->Open(); 2 n- f4 f0 c3 ?2 F; b( U5 c* A4 A
//get the Database Handle
4 N9 y% Y3 e& d g5 Z1 l hDBIDb hDB=temp_table->DBHandle;
8 r7 F/ O. T) W( r* r5 m0 i temp_table->Close();
4 P9 H, Z4 P1 j- n! X+ l+ D
: b3 Z4 ?0 U, w6 Q: p/ u' [ PackParadoxTable(hDB,table_name); 8 r5 M- ~ J2 n A- S. \# r8 e
) y# p9 c8 j- i& P5 C( l
temp_table->Close();
' |8 {2 d6 y) p+ K temp_table->Free();
" X6 e* g d& Q6 v}
$ |6 A7 O) m+ J1 T( Q 8 h5 i) m0 m0 D3 T7 C* d' z) i1 x
/ D# S( e* o1 g! p ]
对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。 |