QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 ( S# v- ~! X3 |# LDelete 9 I' J3 i# q, m8 FMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox $ Q1 Z& }' w5 ]. ?; P表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 9 k0 m" l x% \% V, \+ N6 @ 0 T; a0 a) H" G) u) @ B: q//This function Pack the Paradox table. write by zodiac % n( ~9 t, w5 d3 n: zvoid __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) & |9 q1 \& \4 U: f{ 2 e: K- j3 w8 B6 `: C- z% t& I //Paradox table use a quite different way to be packed than & X2 X# n) z( F; y+ g //DBase or Foxpro table, it use the DBiDoRestructure not the , {( `+ a5 |& u g& C/ L" ` r // DBiPackTable - R- A& [% o7 r* H DBIResult rslt; - q7 d2 X: D3 l; @" C CRTblDesc TblDesc; - O- |! H' @: B9 v5 U1 ]& E //filled the structure CRTbiDesc with 0 : {' a3 Q" `6 \7 @- L9 E memset((void *)&TblDesc,0,sizeof(CRTblDesc)); 2 ]# Z. z( e% h //copy the table name and type to the structure ; l, g% p0 G" w+ X3 G lstrcpy(TblDesc.szTblName,TblName.c_str()); / a, n, I r) |: I' h lstrcpy(TblDesc.szTblType,szPARADOX); 5 ?. h& P0 |# k4 l" O" h //set bPack to true to specify Pack Function 4 X7 J# Z7 y8 R0 L5 `5 L TblDesc.bPack=true; ; d0 [0 o7 S$ f& R d7 q //Pack the table 4 ]3 ~. U/ |& s h- W, W7 U rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); ) Y( a( m/ _/ y3 U if(rslt!=DBIERR_NONE) " c* i8 E7 Z: y- u5 D Application->MessageBox("不能压缩表", ( h! M: z0 M9 A# P8 D "压缩数据表出错",MB_ICONERROR); + X# V1 N5 t3 _3 C/ L7 H! E3 M( v} ! B$ W/ V% h9 X; _ 注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. ) G/ X) g& x* v. j 2 V. q, s( j, i8 }; m2 `4 R void __fastcall TForm1:ackTable(AnsiString table_name) ! O$ ~. Z# X% q' k9 f- h& z { , ^ z' d" S- k: Y6 q ^ H, ? //Pack the table ( T' x+ \& r- _* K TTable *temp_table=new TTable(Form1); 2 `. b$ `; v# ]9 p) P temp_table->DatabaseName="YourDatabaseAlias"; & Z/ C& T9 \9 q temp_table->TableName=table_name; + B w% ^" R) f0 c$ S( N) N% J temp_table->Exclusive=true; 0 j: O$ C/ e/ D0 {$ N" ^ temp_table->Open(); ' e6 @7 F* p r; d //get the Database Handle 0 V; z" C* S% M/ ? hDBIDb hDB=temp_table->DBHandle; : j, d8 ^: l& @' @/ D temp_table->Close(); % e" j, P+ g+ Q7 ?+ J" a) z6 |, i & H5 D5 W+ H. c# e* k' D; z+ }$ u& Q PackParadoxTable(hDB,table_name); ) @$ u9 O8 O3 g! X * v1 G* R& a2 _+ o temp_table->Close(); ) \0 K- k! O# o W, c% Z temp_table->Free(); % Y& D* p* G% @} 9 [* M9 \& {2 c5 ` 5 w. ~% x& b+ c G) v9 u8 l7 n; t2 R, x + ?9 K- o+ t0 G# V 对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-25 00:55 , Processed in 0.803861 second(s), 52 queries .

回顶部