QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 7 r& N: K. h p }* oDelete 0 P# U! H5 I0 ~9 m7 o6 lMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox 0 H. G/ f5 r. @) y6 r% S表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 9 G, |& Z8 A* S6 c% P z 3 R7 r- w; y3 D: y9 u. Y9 m5 w. W5 w# l i//This function Pack the Paradox table. write by zodiac ' m0 a, y$ O8 f. h- m* ]+ Q7 v void __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) ' |8 @, A k) P { h' k! o+ x' @ //Paradox table use a quite different way to be packed than g6 l9 C# i" Y% l2 a. o //DBase or Foxpro table, it use the DBiDoRestructure not the ! u Z2 U) W/ \1 R: a+ z) r // DBiPackTable U; Q7 l( \! d. o; Y DBIResult rslt; " V; P1 ^. b/ B L/ {( s1 [ CRTblDesc TblDesc; : h$ r' F. ^3 I. o) S //filled the structure CRTbiDesc with 0 - g# z. H7 o: ^' H* ] memset((void *)&TblDesc,0,sizeof(CRTblDesc)); 3 E* I1 x# g0 O9 C0 I, Z //copy the table name and type to the structure ) m1 q' v6 D8 E) e% m lstrcpy(TblDesc.szTblName,TblName.c_str()); : q: H+ `7 s: s7 D f0 _. Q" g lstrcpy(TblDesc.szTblType,szPARADOX); / y7 ^5 Q- M: D0 l, _ //set bPack to true to specify Pack Function 4 P3 L* x& I% C- U$ L; f9 L TblDesc.bPack=true; . p O' a; K6 z: [ //Pack the table - j7 C/ O+ Q) N. t5 {& J$ y8 {4 R f4 ` rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); ( ?7 D9 K" R$ h+ C2 h$ M) [6 s, } if(rslt!=DBIERR_NONE) ! R7 e) Q% A& L5 z: y& J1 r Application->MessageBox("不能压缩表", ' ~$ y: d+ L0 ~$ k4 P( a+ O "压缩数据表出错",MB_ICONERROR); . g N* r/ [/ P3 d. j} ) W: Q7 {, g) ^. [! D, e. B/ c注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. ( q* p) a9 p0 Y5 g6 U6 d- h 4 m6 A1 f& u3 }" z2 y# D- T void __fastcall TForm1:ackTable(AnsiString table_name) ) `1 d3 a8 F5 |2 p- h! M{ ( n( [1 v. @( p* T+ ^ //Pack the table ! R4 C6 Y- U4 M3 B6 \ TTable *temp_table=new TTable(Form1); ! h3 G% `4 h4 [' v: m7 P temp_table->DatabaseName="YourDatabaseAlias"; }8 b) X6 n; G! m. Z X temp_table->TableName=table_name; " ^/ s; U/ _( V- Y2 O temp_table->Exclusive=true; ! }5 Y1 X! A P$ y temp_table->Open(); , S {- `- h' I3 | //get the Database Handle ' g$ |: N ? D" b6 S hDBIDb hDB=temp_table->DBHandle; 3 t2 [ d& K! { temp_table->Close(); 0 l/ u( k8 f7 ^, C9 M8 B7 t4 e: _, O 5 ]. {4 j3 {$ l6 T+ K PackParadoxTable(hDB,table_name); - e" k, h6 P @9 i( W # I+ ^" K8 K$ m4 U' G, \( }4 |3 f temp_table->Close(); 3 e: ^2 g9 X: G. `. f$ f temp_table->Free(); 1 L, {) s/ v/ |$ N, a} ! t3 g( U K! S0 Q & F3 i1 h; L, l5 Y4 ~1 } + T+ N, v7 t$ p. @" B' d 对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-12 01:56 , Processed in 0.375561 second(s), 51 queries .

回顶部