|
用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的
8 v" R% f0 c: ^% P" N+ PDelete
8 W& g$ N! ]( B9 b/ N& t% T' e8 ?Method并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox
" e/ J* {* Z! k/ I8 T( L表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 8 V4 g* X; \+ X3 w5 M
: D3 L8 [0 c- ~. ?) _1 \& \- H& h//This function Pack the Paradox table. write by zodiac 1 L( ^+ T8 Y, v/ M+ l
void __fastcall TForm1: ackParadoxTable(hDBIDb hDB, AnsiString TblName) # y9 i. m8 O3 {# ^" Z, P, o
{
8 D# W1 E2 o1 Q1 n# }) p //Paradox table use a quite different way to be packed than ( M5 G+ b: s9 a, b+ y$ }
//DBase or Foxpro table, it use the DBiDoRestructure not the 8 M8 m) C! N2 z" a. M
// DBiPackTable . B5 K# s$ ]6 O5 R( c1 J
DBIResult rslt;
* Z; S$ L2 q8 V; v q! Q CRTblDesc TblDesc;
; |: ?$ M2 ~. b" f //filled the structure CRTbiDesc with 0 . L" r' Z: F& s* o7 p* c
memset((void *)&TblDesc,0,sizeof(CRTblDesc));
! Y: w1 N5 X& r) [) V T9 w //copy the table name and type to the structure
& Q0 x; Y8 U& {+ g, A lstrcpy(TblDesc.szTblName,TblName.c_str()); ! Q* A0 H! X# X8 r
lstrcpy(TblDesc.szTblType,szPARADOX); 7 ^* M1 ]+ y7 h$ Y4 m
//set bPack to true to specify Pack Function
* Z% C- ]* c6 x" i" e TblDesc.bPack=true; / L+ P0 P' t. w5 R$ a3 M5 b
//Pack the table
! p1 q5 k& v. |# c$ X1 I; Z4 o; C rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); , M1 s G. a! ~6 v3 M3 Q
if(rslt!=DBIERR_NONE) ) R$ S2 N9 v* F. p$ o
Application->MessageBox("不能压缩表",
& w/ }( t1 X* l. S "压缩数据表出错",MB_ICONERROR); - K& U, M2 y" ?, Y3 ^3 O3 U; [' C* F
}
4 b7 I: e4 C" V3 `0 M7 k注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable.
% m( C$ f7 L T" i: @1 ~! f5 \ 7 {+ l( a0 M* ]9 s
void __fastcall TForm1: ackTable(AnsiString table_name)
6 Q: Z2 h: r* k2 l{
, H- t4 m; c8 U( x" n$ J //Pack the table 9 A0 \6 ]: ]) M0 ]( z
TTable *temp_table=new TTable(Form1);
( B8 w5 y8 z& w" V, w& n$ ~ temp_table->DatabaseName="YourDatabaseAlias"; " e0 d, {$ _. `% o& r' [
temp_table->TableName=table_name; , L/ @1 b$ y" f
temp_table->Exclusive=true;
) q( }+ r& R! t9 X0 C! ]( z temp_table->Open();
2 ^" W/ A- D+ f //get the Database Handle
' L/ M) T8 o* z. I, o hDBIDb hDB=temp_table->DBHandle; ' }: O. Q) P1 _: J7 u; H ?8 g
temp_table->Close(); : k" d, |5 G& o# Y7 m* T1 x
8 s! u6 A* p4 K* N$ A
PackParadoxTable(hDB,table_name);
$ D7 F8 Z4 |5 @) a! T( w; Y3 |; L
. Q3 f: v: W+ F* h2 R temp_table->Close(); 5 z5 G9 t6 O$ w1 ?' ?
temp_table->Free();
; x! X* d# i7 N}
, V0 C( I( `& P! C( O9 f/ B 8 N+ q& _' c9 X G/ q
* X6 c8 E* H, o2 `对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。 |