QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 , P' f J* m3 R; D: h Delete : ]- R+ E8 N( s4 m& rMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox ' M: K: W; _# t& i5 j表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 , k/ e' \- l: n1 W- M0 l$ T / c U @9 Z6 B t9 L) Q" @+ {//This function Pack the Paradox table. write by zodiac 1 x: S4 P" T mvoid __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) 2 \& q' Y! W9 J4 }+ v. B+ q { / X" f# F, s9 b" A d //Paradox table use a quite different way to be packed than # d% O0 p, R- g9 H //DBase or Foxpro table, it use the DBiDoRestructure not the ; Z6 ]5 v, X& y1 T3 T# b# I // DBiPackTable 1 B+ B# c: x: j" N( h+ r$ m+ B DBIResult rslt; 5 i- D% Q8 [; P6 C) c& C! R CRTblDesc TblDesc; / n* u$ J* E2 K ]$ a z- [ //filled the structure CRTbiDesc with 0 * K0 `4 h9 ]% j% E5 ^4 r memset((void *)&TblDesc,0,sizeof(CRTblDesc)); 4 \. F D. E) `6 u7 o //copy the table name and type to the structure ; g6 c$ E" e1 Z1 P8 v' ~# v lstrcpy(TblDesc.szTblName,TblName.c_str()); ) Y/ Z' N# H5 z* i7 Z3 Q8 K; L1 r, C lstrcpy(TblDesc.szTblType,szPARADOX); % C& k# b4 G w7 r //set bPack to true to specify Pack Function " h; U* |# j) t TblDesc.bPack=true; ) n" e8 K- A3 _6 D/ m+ }6 s! P //Pack the table / N; b: C, P% M. O p. t rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); ! h6 Z% b$ Z$ L0 v0 I7 t( Y if(rslt!=DBIERR_NONE) , Q% U f* l: d5 U/ | Application->MessageBox("不能压缩表", ; Z& c6 ~2 t1 m) s "压缩数据表出错",MB_ICONERROR); 0 L# D2 D2 A0 i, T( a } ' S, s" N+ @1 ^$ Z3 P- a 注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. # L3 d. o7 f" m5 \, q $ b" L3 Q5 Z) Y0 U' V0 zvoid __fastcall TForm1:ackTable(AnsiString table_name) 8 W+ n5 D; G3 Z{ 8 e0 V% @' _, k% ]9 Q2 S //Pack the table + r: _) x" N; D8 R8 K# ~ TTable *temp_table=new TTable(Form1); & |) X; q/ R: u' j/ N q7 ^! A temp_table->DatabaseName="YourDatabaseAlias"; 3 o* [8 _8 g* |2 q2 G temp_table->TableName=table_name; ! p8 q7 v9 J# z temp_table->Exclusive=true; & A9 t& X2 l0 Q! D( y0 _ temp_table->Open(); ( s# p+ g" h( z //get the Database Handle " g* n+ E8 T" o hDBIDb hDB=temp_table->DBHandle; 0 R& [- i$ d, @4 W/ r0 |0 \% I temp_table->Close(); 3 K: i5 B1 s" p; c. \ , J! A" f1 t, L1 ~$ r T PackParadoxTable(hDB,table_name); ! c) V$ ^2 [$ S1 c' f: N b1 U# }5 I7 Y% e% }' K temp_table->Close(); ( @/ w3 H+ h8 g) u. t temp_table->Free(); 9 ?. `0 j8 O/ i K} D- l( y8 U* d7 |3 y: `3 ~ " a1 y5 H0 @ ~2 m4 ^) R 3 J5 e2 F8 h3 Q! ~对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-8-10 10:33 , Processed in 0.411113 second(s), 52 queries .

回顶部