BCB中如何给Table减肥

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表档 大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会出现这种现象,是因为TTable控件的 Delete Method并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中用Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox 表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。

//This function Pack the Paradox table. write by zodiac
void __fastcall TForm1::PackParadoxTable(hDBIDb hDB, AnsiString TblName)
{
//Paradox table use a quite different way to be packed than
//DBase or Foxpro table, it use the DBiDoRestructure not the
// DBiPackTable
DBIResult rslt;
CRTblDesc TblDesc;
//filled the structure CRTbiDesc with 0
memset((void *)&TblDesc,0,sizeof(CRTblDesc));
//copy the table name and type to the structure
lstrcpy(TblDesc.szTblName,TblName.c_str());
lstrcpy(TblDesc.szTblType,szPARADOX);
//set bPack to true to specify Pack Function
TblDesc.bPack=true;
//Pack the table
rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false);
if(rslt!=DBIERR_NONE)
Application->MessageBox("不能压缩表","压缩数据表出错",MB_ICONERROR);
}

注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable.

void __fastcall TForm1::PackTable(AnsiString table_name)
{
//Pack the table
TTable *temp_table=new TTable(Form1);
temp_table->DatabaseName="YourDatabaseAlias";
temp_table->TableName=table_name;
temp_table->Exclusive=true;
temp_table->Open();
//get the Database Handle
hDBIDb hDB=temp_table->DBHandle;
temp_table->Close();
PackParadoxTable(hDB,table_name);
temp_table->Close();
temp_table->Free();
}

对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。

时间: 2024-11-03 22:03:57

BCB中如何给Table减肥的相关文章

BCB中的RTTI机制

BCB中的RTTI机制RTTI在BCB中其实有两个意义.首先,针对一般标准的C++中所定义的,RTTI是所谓的Run-Time Type Identification的缩写.传统的程序语言中,所谓的数据型态仅在Compile-Time有所作用.举例而言,您宣告了一个变量a,并且指定其型态为整数.您如何在Run-Time期间知道他的型态是整数呢?很遗憾的是,在原来的C/C++中您是无法知道这样的事情的.或者会问,这样的信息有何作用?若是您考虑对象的继承关系,您就会发现其重要性了.举例而言,若您有下

在BCB中使用VCL控件数组2

我的<BCB中使用VCL控件数组>中,提到了用TList来实现时无法释放资源的问题,结果今天就得到了答案,邬彦华等等网友都指教了TList实现的释放方法,定义代码同前文: for (int i=1;i<=ButtonCount;i++) { TSpeedButton *spdBtn=new TSpeedButton(this); spdBtn->Parent=ScrollBox;//指定父控件 spdBtn->Caption=IntToStr(i); spdBtn->W

BCB中如何读写硬件端口

BCB中利用__emit__函数可以直接将二进制程序代码嵌入程序中,这样就可以实现一些底层的操作.由于直接操作系统底层,这种方法可能会导致系统的不稳定. 下面是利用__emit__函数读写硬件端口的方法. //读端口 //port参数为输入端口地址,value为返回值. unsigned char __fastcall inportb(unsigned short int port) { unsigned char value; __emit__(0x8b,0x95,&port); //把端口地

如何在BCB中使用DirectX

这是一个简要的指南,可以指导你如何在BCB中使用DirectX SDK. 我在这里假定你的BCB的安装路径在:C:\Borland\CBuilder\,DirectX SDK在C:\dx5sdk\ 设置 Borland C++ Builder #include 这是许多人遇到的麻烦, Borland在BCB的\Include路径下提供了DirectX的头文件, 如果只是把c:\dx5sdk\sdk\inc\加到BCB的include路径下,它会进行如下步骤: 查找 C:\Borland\Cbui

在BCB中轻松使用ActiveX控件

在微软的大力扶持下,越来越多的软件公司开始支持ActiveX了,这对于喜欢编程的朋友来说可是件值得高兴的事!因为我们可以在程序中很方便地调用外部的OCX文件来实现复杂的功能,而在BCB中只带有很少几个ActiveX控件,大部分我们需要我们自己安装,下面通过对RealPlayer与Flash控件的安装与应用,让我们共同来学习ActiveX的组件在BCB中的使用方法:) 一.安装.导入ActiveX控件 C++ Builder在对ActiveX的支持方面可说是做得非常出色,我们可以很方便地导入系统中

CLR探索系列-GC中的Card table和Brick Table(垃圾回收系列)

在CLR的垃圾回收子系统中,Card Table和Brick Table是两个比较有意思的表. 在GC的过程中,一个Heap在运行了一段时间以后,已经分配的空间就会越来越大.在进行了一次局部代或者是完全的垃圾回收以后,就会涉及到一个GC堆的类似碎片整理的概念.整理优化一次GC Heap.同时,这种机制保证了譬如一个IIS Server在长时间的运行过程中的稳定性并且优化了其内存管理. 这样的好处是显而易见的,但是采用这种解决方案带来的问题也很容易想到:譬如一个存在于GC Heap里面的"Smal

求一个ssh项目中的display:table标签实现分页的完整代码

问题描述 求一个ssh项目中的display:table标签实现分页的完整代码 /display:column/display:column/display:column/display:column /display:column /display:column/display:setProperty/display:table

BCB中选择文件对话框TOpenDialog过滤后缀名使用方法

BCB中使用TOpenDialog选择对话框时,直接OpenDialog->Execute()弹出的对话框是显示所有文件的,如果我们希望过滤指定的文件后缀名就需要在Execute()前做一些初始化工作,此处主要使用Filter属性.代码如下:[喝小酒的网摘]http://blog.hehehehehe.cn/a/8453.htm 只显示txt文本文件.OpenDialog1->Filter = "Text files (*.txt)|*.TXT"; 多个下拉框,可只显示tx

在按下按钮后,将view.aspx文件引入到index.aspx中的表格TABLE中来?

问题描述 在按下按钮后,将view.aspx文件引入到index.aspx中的表格TABLE中来?原来的index.aspx文件内容不发生改变.index.aspx.cs文件:protectedvoidButton1_Click(objectsender,EventArgse){} 解决方案 解决方案二:这样行不?<%@includefile="a.jsp"%>解决方案三:这样行不?<%@includefile="a.aspx"%>解决方案四