QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2507|回复: 0
打印 上一主题 下一主题

如何给Table减肥

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 12:36 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

用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函数说明。

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-14 22:05 , Processed in 0.443278 second(s), 52 queries .

回顶部