QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 7 \* M! Y9 |% ^0 BDelete 4 N* S2 C, q- T' u) X Method并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox & u; I5 P: D& k' g" N5 z1 t# K表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 ' Z& w6 N8 t1 L1 z8 j2 M* y% D8 g 2 a j$ n3 ~5 v5 Q; l6 ? //This function Pack the Paradox table. write by zodiac : I$ _, E Y6 Y" W( _void __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) 7 V2 ]9 c# j/ P" S3 i% T8 P{ - ~: `2 E2 w0 J' O. ~1 L/ F9 o$ J //Paradox table use a quite different way to be packed than 4 Z$ J6 M+ |( y //DBase or Foxpro table, it use the DBiDoRestructure not the 4 p- p$ E5 T) A7 E // DBiPackTable + R6 {4 f8 G% B9 v3 ~1 d( i a4 L DBIResult rslt; 4 V2 [2 H9 q5 R, P' ?9 I CRTblDesc TblDesc; 0 r: p& K( x7 [" v //filled the structure CRTbiDesc with 0 - w8 F! ?& Z9 Q+ H6 g5 h; ]" X memset((void *)&TblDesc,0,sizeof(CRTblDesc)); , v+ s- `( L" {# B! _% l5 M //copy the table name and type to the structure 0 ?8 h* [+ a- s. @" \. m lstrcpy(TblDesc.szTblName,TblName.c_str()); + ?$ V# N5 a; ? Z$ Z, [, J lstrcpy(TblDesc.szTblType,szPARADOX); # r) D- D1 l3 O7 u9 G //set bPack to true to specify Pack Function 2 ]4 {* t% i+ Q& L: i. M TblDesc.bPack=true; . T! P5 m. Z* ` //Pack the table ( l4 m" {& }! [! h: ~* T# {+ j rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); 8 l& I3 _) I! l/ g; h% V; l if(rslt!=DBIERR_NONE) + ]1 Q ^) _- m Application->MessageBox("不能压缩表", J4 D9 r& ]$ c5 @- c "压缩数据表出错",MB_ICONERROR); # b, V) i$ D' U/ w5 n; E+ E+ N. {; G: g} - A `) O" p8 S- ^( ^ 注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. 1 p4 S5 ]1 u, U7 ~$ ?0 u( v% S 8 z3 S# x, f' e0 |, f- Vvoid __fastcall TForm1:ackTable(AnsiString table_name) 7 ]* C. b) U# q) _ { , @1 v! Z1 I% w: Y$ s //Pack the table 4 M# k6 d3 I4 W# b2 l TTable *temp_table=new TTable(Form1); ! A6 n' z+ ~5 ]' U! q, ^ temp_table->DatabaseName="YourDatabaseAlias"; . r# B1 E& |+ D; p5 n4 n# u temp_table->TableName=table_name; 7 U5 n q% f5 @! q3 E temp_table->Exclusive=true; 5 C- {% M$ |! W) w temp_table->Open(); , P, B0 f% A/ { V //get the Database Handle 7 C* A' e8 ?& q hDBIDb hDB=temp_table->DBHandle; 2 ^4 y) h% V2 M& k temp_table->Close(); 3 r5 | }8 m& i* t9 e o * d2 O3 W2 C7 Q: X# h- C7 |. G PackParadoxTable(hDB,table_name); 5 n5 P" n1 N! R( Q. h * ?$ k; r$ [2 L6 Z8 i: J! R% F temp_table->Close(); , D5 c7 k0 c8 x4 e% K temp_table->Free(); 1 j) ?! R* U# Y/ v: { } 3 r6 o8 I2 X' h6 M P1 k' Y8 h: o( H. R7 q. Q ) U5 i* D8 g, S, {# n6 `对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-10-17 09:03 , Processed in 0.374181 second(s), 51 queries .

回顶部