|
用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 " x4 O n; I9 |# q. i8 |7 g. o# E C. g
Delete
1 y7 Y! e1 z% @ b. o' S1 s% RMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox
0 Y5 A3 V! N3 a/ o9 R$ w! }4 E表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。
* ~6 M$ }' z, M1 V+ w % J; g9 o6 S- c0 q' g# M& t
//This function Pack the Paradox table. write by zodiac - x; ?, E+ I/ b& M; M& m# u E3 `% ]
void __fastcall TForm1: ackParadoxTable(hDBIDb hDB, AnsiString TblName) 7 [% B% k8 ]. n) l
{
# l/ A% ?( B" ?' i //Paradox table use a quite different way to be packed than
+ g3 H! d% {( W' W, S0 D //DBase or Foxpro table, it use the DBiDoRestructure not the 3 g6 ~& e+ q1 ]
// DBiPackTable ) |# i% ]1 D: n
DBIResult rslt; - @$ b5 k! T8 h% Q- a
CRTblDesc TblDesc;
1 ]% d x5 z4 U* F2 D' Q" L% P //filled the structure CRTbiDesc with 0 9 ?4 r4 l2 P: D! J7 p
memset((void *)&TblDesc,0,sizeof(CRTblDesc)); 2 _3 a/ R" s9 D4 \! ^0 p
//copy the table name and type to the structure 9 x& Y& G" K H
lstrcpy(TblDesc.szTblName,TblName.c_str()); , t+ C( C" j4 F) W
lstrcpy(TblDesc.szTblType,szPARADOX);
$ W" `$ p* }2 ?: c, @7 m7 m" s //set bPack to true to specify Pack Function 7 }# [3 z, N; Q; }2 g
TblDesc.bPack=true; 8 M3 R. i8 o' `9 y$ [
//Pack the table
3 U# z* y1 N, N3 L1 G rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); , g) N6 v: Y& k" l/ c6 B
if(rslt!=DBIERR_NONE) : E: v; L6 G" F8 `. ]
Application->MessageBox("不能压缩表",
" h v5 }( B+ z$ C8 y- I "压缩数据表出错",MB_ICONERROR);
) [; x& Y! h" X}
. g. O! l8 ?0 _注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable.
- m9 M$ ?- N Y8 D3 r9 E 7 \' v# U1 y3 k. ]# c# W) Z
void __fastcall TForm1: ackTable(AnsiString table_name)
. ~; X) k' P' @% c w{
5 r' d4 o: j' d/ Y. x5 b //Pack the table % {( ^" i3 b9 m, e a& s$ q- k
TTable *temp_table=new TTable(Form1);
3 k; l* I( Z6 c" Y! }+ C& O temp_table->DatabaseName="YourDatabaseAlias";
4 Q! z C, c$ p5 t% X temp_table->TableName=table_name;
0 G6 }* S0 G9 O8 v temp_table->Exclusive=true; % f% _# L* h- ^* R0 @9 ]
temp_table->Open(); 4 Z7 V- `. M2 S& g ~$ Z
//get the Database Handle ( a( F% K* I2 ^7 R1 M6 j
hDBIDb hDB=temp_table->DBHandle; * v# D& X* N! f) W# Y$ s6 D
temp_table->Close(); & X- R1 N3 @6 K0 q8 R" N$ a+ e
" B/ K: A0 ?* y$ X PackParadoxTable(hDB,table_name);
& D5 E$ g: O9 P9 D4 F2 Z7 W , X1 S+ M9 H* W3 ~
temp_table->Close();
& A& C0 g) Y2 C4 {4 }" ] temp_table->Free();
2 S2 j ?+ V& B6 G& _: |}
7 ` J2 F* W7 y 6 r) l7 \2 A9 }
8 Y+ H* J, d1 r7 Q0 ?' u$ U; q4 p3 W
对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。 |