有谁知道Access的压缩修复功能是怎么实现的????(这个问题有人碰到过吗) lyq2276959,cozo再来关注一下! (55分)

  • 主题发起人 主题发起人 txyx
  • 开始时间 开始时间
T

txyx

Unregistered / Unconfirmed
GUEST, unregistred user!
希望能做到相同的功能
 
读读源程序就OK
 
压缩:
var
dao: OLEVariant

begin
dao := CreateOleObject('DAO.DBEngine.35')

dao.CompactDatabase('d:/yourDatabaseName.mdb',
'd:/yourNewCompactedDatabaseName.mdb')

end

修复:
var
dao: OLEVariant

begin
dao := CreateOleObject('DAO.DBEngine.35')

dao.RepairDatabase('d:/yourDatabaseName.mdb')

end


 
下面agritax.mdb是目标数据库,数据库的口令是agriculture,如果没有口令则还可以简单点
我用的是Access97需引用dao97
function daocompactdb:boolean
//compactdatabase
var
srcfile,dstfile:widestring;
db:_DBEngine;
dtbs:database;
begin
srcfile:=extractfilepath(application.ExeName)+'agritax.mdb';
dstfile:=extractfilepath(application.ExeName)+'tempfile.mdb';
try
try
db:=coDBEngine.Create;
dtbs:=db.OpenDatabase(srcfile,true,false,';pwd=agriculture');
dtbs.NewPassword('agriculture','');
dtbs.Close;
dtmd.DataModule1.adocntion.Connected:=false;
db.CompactDatabase(srcfile,dstfile,emptyparam,emptyparam,'');
dtmd.DataModule1.adocntion.Connected:=false;
if not copyfile(pchar(dstfile),pchar(srcfile),false) then
begin
deletefile(dstfile);
result:=false;
exit;
end;
finally
dtbs:=db.OpenDatabase(srcfile,true,false,';pwd=');
dtbs.NewPassword('','agriculture');
dtbs.Close;
dtmd.DataModule1.adocntion.Connected:=true;
end;
result:=true;
except // wrap up
dtmd.DataModule1.adocntion.Connected:=true;
result:=false;
dtmd.DataModule1.adocntion.Connected:=true;
end
// try/except
deletefile(dstfile);
dtmd.DataModule1.adocntion.Connected:=true;
end;
function daorepairdb:boolean
//repairdatabase
var
db:_DBEngine;
begin
db:=coDBEngine.Create;
try
db.RepairDatabase(extractfilepath(application.ExeName)+'agritax.mdb');
result:=true;
except
result:=false;
end;
end;

 
我以前用DAO的时候实现过,不过是在VB中,是WorkSpace的CompactDatabase
和RepairDatabase两个方法,不过调用以前不能独占数据库,而且调用的时候
可以吧数据库另存为其他的库
 
to lyq2276959
运行时说我尚未调用CoInitialize,什么意思啊???
 
怎么用CoInitialize???
 
事实上,从原理上来说,压缩和修复只是把数据库整修复制了一遍,因为access数据库在删除记录过程中,
不会物理删除,它仍然占用空间,而且这是个无法解决的问题。
压缩的实际过程就是access新建一个数据库,将原始数据全部copy一遍,这样就去掉了那些多余的数据。
我想,这个功能实现起来不难吧。
 
谢谢你,原理我懂了,能不能讲一下CoInitialize是怎么搞的?
 
对COM我不懂,能说一下怎么让它进行下去吗?
压缩:
var
dao: OLEVariant

begin
dao := CreateOleObject('DAO.DBEngine.35')

dao.CompactDatabase('d:/yourDatabaseName.mdb',
'd:/yourNewCompactedDatabaseName.mdb')

end;
 
似乎需要导入MS的DAO才行,不能直接用的吧。
 
怎么个导入法????
 
后退
顶部