最近写程序用到access数据库,运行不久就发觉速度很慢,后来察觉是数据库文件太大有100多兆,
所以想方设法在程序中即时清理无用记录,但用不了多久这个数据库文件又大到100M多兆。几经
周折才发现原来access中有一个“数据压缩”的菜单命令,压缩后,100多兆文件变为3兆多。现在的问题是压缩后3兆多的文件不久又变到100多兆。而真正存的记录绝没有那么大。
请问有没有什么方法用代码实现自动压缩,或达到此目的的别的方法?
谢谢各位同行。
所以想方设法在程序中即时清理无用记录,但用不了多久这个数据库文件又大到100M多兆。几经
周折才发现原来access中有一个“数据压缩”的菜单命令,压缩后,100多兆文件变为3兆多。现在的问题是压缩后3兆多的文件不久又变到100多兆。而真正存的记录绝没有那么大。
请问有没有什么方法用代码实现自动压缩,或达到此目的的别的方法?
谢谢各位同行。
uses 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;