关于MDB文件压缩的问题!(100分)

W

wuqiu

Unregistered / Unconfirmed
GUEST, unregistred user!
我要写一个压缩Access数据库的程序,我查资料有一个方法可以做到:方法如下
Function CompactAndRepair(sOldMDB : String; sNewMDB : String) : Boolean;
const
sProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;';
var
oJetEng : JetEngine;
begin
sOldMDB := sProvider + 'Data Source=' + sOldMDB;
sNewMDB := sProvider + 'Data Source=' + sNewMDB;
try
oJetEng := CoJetEngine.Create;
oJetEng.CompactDatabase(sOldMDB, sNewMDB);
oJetEng := Nil;
Result := True;
except
oJetEng := Nil;
Result := False;
end;
end;
这样做可以压缩一般的MDB数据库,但是对于加了密的MDB数据库就无能为力了。
我反复尝试,后面试出了一种方法可以压缩加了密的数据库,方法如下:
Function CompactDatabase(nOldMDB,nNewMDB,nPassword:pChar) : Boolean;stdcall;
var
JetEng : JetEngine;
sOldMDB,sNewMDB:WideString;
begin
sOldMDB :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
sOldMDB :=sOldMDB+nOldMDB;
sOldMDB :=sOldMDB+';Persist Security Info=False;';
sOldMDB :=sOldMDB+'Jet OLEDB:Database Password='+nPassword;

sNewMDB :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
sNewMDB :=sNewMDB+nNewMDB;
// sNewMDB :=sNewMDB+';Persist Security Info=False;';
// sNewMDB :=sNewMDB+'Jet OLEDB:Database Password='+nPassword;

try
JetEng := CoJetEngine.Create;
JetEng.CompactDatabase(sOldMDB, sNewMDB);

JetEng := Nil;
Result := True;
except
JetEng := Nil;
Result := False;
end;
end;
经过这样更改后的确可以压缩加了密的数据库,不过这样经压缩后的数据库就没有密码了。
我尝试改为(就是上面把那两个注释符去掉)
sNewMDB :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
sNewMDB :=sNewMDB+nNewMDB;
sNewMDB :=sNewMDB+';Persist Security Info=False;';
sNewMDB :=sNewMDB+'Jet OLEDB:Database Password='+nPassword;
但这样就不行了,老是出现异常,信息如下:
Project Project1.exe raised exception class EOleException with message'Multiple-
step OLE DB operation generated errors.Check each OLE DB Status value,if available.
No work was done'.Process stopped.Use step or Run to continue.
请高手帮忙解决
 
GZ
改变打开方式怎么样?在Access中要压缩数据库必须以独占方式打开。
 
谢谢楼上的,但现在不是压缩不了加密数据库的问题,而是压缩后的数据库密码丢失了,
我是想让压缩后的数据库保持跟原来一样的密码。
 
将你的这句:
sNewMDB :=sNewMDB+'Jet OLEDB:Database Password='+nPassword;
改为:
sNewMDB :=sNewMDB+'Jet OLEDB:Database Password="'+nPassword+'"';
应该就可以了。
 
问题解决,哈,我原来的做法是对的,只不了我少打了个标点符号,改成这样就行了
sOldMDB :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
sOldMDB :=sOldMDB+nOldMDB+';'; // 这里多个分号
sOldMDB :=sOldMDB+'Jet OLEDB:Database Password='+nPassword;

sNewMDB :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
sNewMDB :=sNewMDB+nNewMDB+';'; // 这里多个分号
sNewMDB :=sNewMDB+'Jet OLEDB:Database Password='+nPassword;
 
谢谢各位热情发言
 
请问wuqiu,你的JetEngine怎么用呢?
 
顶部