QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 ( v! F6 P& g7 Y" | Delete % S% U/ o9 `& O; o& ~' n9 | Method并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox * G. p5 Y' b6 B8 S表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 8 c) E1 `. o, a f 0 t. ~" s' n6 i//This function Pack the Paradox table. write by zodiac 9 v1 V9 z+ S: X& o void __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) 5 @; J) N9 h. K% n4 R, f { ) {3 a/ H- ]5 y, j //Paradox table use a quite different way to be packed than / Y' M9 w. D. a1 R/ D% B5 ^ //DBase or Foxpro table, it use the DBiDoRestructure not the / v2 Z5 k1 x" A2 h // DBiPackTable : L5 Y6 q5 C }2 ?. X5 B2 z DBIResult rslt; 0 A* z* E; `4 y9 f% O- ]4 g9 s3 } CRTblDesc TblDesc; " b0 ?+ T! J9 Z //filled the structure CRTbiDesc with 0 1 j9 A0 H2 B2 X- g6 s memset((void *)&TblDesc,0,sizeof(CRTblDesc)); / [# P8 w5 k2 T x //copy the table name and type to the structure 5 d6 W1 s+ o' l# z' h) w/ m( k lstrcpy(TblDesc.szTblName,TblName.c_str()); / j8 C( A) q; ~. Z* F lstrcpy(TblDesc.szTblType,szPARADOX); C1 z4 t% _5 o' a# Y //set bPack to true to specify Pack Function 3 B2 O; T" W3 G* L" j+ [ TblDesc.bPack=true; $ h$ L( F' i; k7 s/ a. \+ h //Pack the table 4 g6 z! p/ i) k" q M rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); , o% P! o8 f( j6 f- M! t if(rslt!=DBIERR_NONE) ! R' V4 I/ `9 |6 t- s! R& w Application->MessageBox("不能压缩表", " Q0 u% B1 C7 b" S' ^/ S "压缩数据表出错",MB_ICONERROR); d3 z3 X. ^+ e; z; M0 o; P- {4 Q } . C# W% X7 Z1 U/ d, A( V注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. 2 ^( `. }# z' O7 R" @/ Y8 x1 O( P - H8 e `1 \. i void __fastcall TForm1:ackTable(AnsiString table_name) 7 v1 p4 |, F) b! K7 Q/ i{ . o0 {: W2 @7 { //Pack the table 0 J$ P/ k7 d# j, `! ~ TTable *temp_table=new TTable(Form1); ! T) b6 l( S& C7 s$ j/ Y temp_table->DatabaseName="YourDatabaseAlias"; ! I4 i% c4 f9 e" K: u temp_table->TableName=table_name; 1 N" h$ E% f* k. C) W* C2 r( u temp_table->Exclusive=true; 4 p; g# c+ a9 m8 h8 V0 n temp_table->Open(); 8 {6 {! D/ a' X/ Q& r( `7 ~+ k //get the Database Handle ) X# ]6 ^* J9 {8 R7 d hDBIDb hDB=temp_table->DBHandle; 0 R. p, h( e$ P+ h( i; _! P7 f6 l& l. h8 D temp_table->Close(); $ Y# [, B& |6 {3 x2 I/ Q4 d |7 l % X0 X- A3 Q4 c$ Z PackParadoxTable(hDB,table_name); 6 I. {* y; T; \' l & ^' ^1 A; i ^( w6 b! z temp_table->Close(); & E' ?% e$ s# H* Q6 U temp_table->Free(); $ U* A* K% ^+ x0 [$ m" K } 1 }+ L, s( J/ H 7 g2 m# a% y' f6 I 6 E* h$ y% w- _# R对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 11:31 , Processed in 0.993315 second(s), 52 queries .

回顶部