数据库中记录添加一条记录,再删除了,但是数据库大小仍然是增大了,这样如果频繁进行增减操作,那数据库不是变得很大了?请问如何解决?(80分)

  • 主题发起人 主题发起人 powerpopeye
  • 开始时间 开始时间
P

powerpopeye

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库中记录添加一条记录,再删除了,但是数据库大小仍然是增大了,这样如果频繁进行增减操作,那数据库不是变得很大了?请问如何解决?
 
是否用ACCESS数据库,定期压缩,用ACCESS打开,工具就有。
如程序要办到的话,以前有很多贴子,查查ACCESS数据库压缩,会有很多的。
 
写个程序,在程序运行初就对数据进行压缩或整理!
 
安装 DiamondAccess 控件。。

if Application.MessageBox('是否要压缩数据库(inv.mdb)?!', '提示', 48 + mb_OkCancel+ MB_DEFBUTTON2) = IDOK then
begin

dm_main.DAODb_main.Close;
dm_main.DAODb_main.Connected:=False;
if __DBEngine36 = nil then CreateEngine (Dao36, '');
__DBEngine36.CompactDatabase ('inv.mdb', 'invtemp.mdb',';pwd=Tomcat@china',0,'; pwd=Tomcat@china' );
DeleteFile('inv.mdb');
RenameFile('invtemp.mdb','inv.mdb');
dm_main.DAODb_main.Open;
Application.MessageBox('压缩数据库成功!', '提示', 48 + mb_ok);

end;


就很好用。

我才整理硬盘 , 正好看见你要。 给你 看看。
 
上哪儿找DiamondAccess?
 
编程压缩。会吗?
 
给出一个比较好的解决方法
第一个参数为原始数据库文件名(完整路径),第二个参数为密码
修改后可以实现压缩后与压缩前有不同的密码!
//引用ComObj,ActiveX
function CompactDatabase(AFileName,APassWord:string):boolean;
//压缩与修复数据库,覆盖源文件
const
SConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
+'Jet OLEDB:Database Password=%s;';
var
SPath,SFile:Array [0..254] Of Char;
STempFileName:String;
JE:OleVariant;
begin
GetTempPath(40,SPath);//取得Windows的Temp路径
GetTempFileName(SPath,'~CP',0,SFile);//取得Temp文件名,Windows将自动建立0字节文件
STempFileName:=SFile;//PChar->String
DeleteFile(STempFileName);//删除Windows建立的0字节文件
try
JE:=CreateOleObject('JRO.JetEngine');//建立OLE对象,函数结束OLE对象超过作用域自动释放
OleCheck(JE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord])));//压缩数据库
//复制并覆盖源数据库文件,如果复制失败则函数返回假,压缩成功但没有到函数的功能
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);//删除临时文件
except
result:=false;//压缩失败
end;
end;
 
收缩一下数据库就行了.
其实看一看数据库的实验原理就知道了.
删除操作只是打上一个删除的标记,而并不真的把他从数据库中删除。
如果每次删除都真的把空间释放,那会有多慢哪?
只有在进行收缩(或叫做压缩)操作时才真正的把空间释放掉
 
还是用DAO连接access数据库吧,这样不仅速度快,而且写起各种函数也比较简单,比如
压缩数据库:
var
dao: OLEVariant;
begin
dao := CreateOleObject('DAO.DBEngine.35');
dao.CompactDatabase('d:/yourDatabaseName.mdb',
'd:/yourNewCompactedDatabaseName.mdb');
end;

是不是比楼上兄弟的简单些?
 
如果数据库带密码怎么样呢办
 

Similar threads

S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部