uses ComObj; function DaoActive(var DaoObject: OleVariant): Boolean; begin Result:=False; try DaoObject:=GetActiveOleObject('DAO.DBEngine.36'); Result:=True; except try DaoObject:=CreateOleObject('DAO.DBEngine.36'); Result:=True; except DaoObject:=Null; end; end; end; //压缩数据库 var db:OleVariant; TempFile:string; FilePath:string; begin try if not DaoActive(db) then Exit; try TempFile:='D:\tempA.mdb';//临时文件 db.CompactDatabase('D:\A.mdb',TempFile,';PWD=123',0,';PWD=123'); DeleteFile(PChar('D:\A.mdb'));//删除原文件 RenameFile(TempFile,'D:\A.mdb');//重命名 except on E:EOleException do ShowMessage(E.Message); end finally db:=Unassigned; end;
将数据库压缩并设置密码:uses comobj;procedure TForm1.Button1Click(Sender: TObject); var dbe:OleVariant; begin dbe:=CreateOleObject('dao.dbengine.36'); dbe.CompactDatabase('D:\a.mdb','d:\b.mdb','',0,';pwd=mima'); end;
以下代码在Delphi6+Office2000正常用过 //引用ComObj,ActiveX function TFAutoStat.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;procedure TFAutoStat.ActCompactDBExecute(Sender: TObject); var sFileName: String; begin sFileName:=ExtractFilePath(Application.ExeName)+'..\DataBase\AutoStat.mdb'; sBarText('正在压缩数据库,请稍候......'); Self.Enabled:=false; Self.Cursor:=crSqlWait; try AdoConnection.Close; //需要断开数据库 if CompactDatabase(sFileName,'1234') then sBarText('压缩数据库完毕') else ShowMessage('压缩数据库失败!'); ConnectToDB(); finally Self.Enabled:=true; Self.Cursor:=crDefault; end; end;
function DaoActive(var DaoObject: OleVariant): Boolean;
begin
Result:=False;
try
DaoObject:=GetActiveOleObject('DAO.DBEngine.36');
Result:=True;
except
try
DaoObject:=CreateOleObject('DAO.DBEngine.36');
Result:=True;
except
DaoObject:=Null;
end;
end;
end;
//压缩数据库
var
db:OleVariant;
TempFile:string;
FilePath:string;
begin
try
if not DaoActive(db) then
Exit;
try
TempFile:='D:\tempA.mdb';//临时文件
db.CompactDatabase('D:\A.mdb',TempFile,';PWD=123',0,';PWD=123');
DeleteFile(PChar('D:\A.mdb'));//删除原文件
RenameFile(TempFile,'D:\A.mdb');//重命名
except
on E:EOleException do
ShowMessage(E.Message);
end
finally
db:=Unassigned;
end;
//压缩数据库并制作新密码数据库副本 for Access
//需引用的单元: ComObj, Variants
procedureDBCompress;
var
vJE:OleVariant;
begin
try
try
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(Format(sConn,[JobPath + 'DATA.mdb','OldPassword']),
Format(sConn,[JobPath + 'DATA.mdbx','OldPassword']));
DeleteFile(PChar(JobPath + 'DATA.mdb'));
RenameFile(JobPath + 'DATA.mdbx',JobPath + 'DATA.mdb');
//更改数据库密码 2008-03-05
//vJE.CompactDatabase(format(SConnectionString,[GetTempDir + 'DATA.mdb','OldPassword']),
// format(SConnectionString,[GetTempDir + 'NewDATA.mdb','NewPassword']));
finally
vJE:= Unassigned;
end;
except
vJE:= Unassigned;
end;
end;
var
dbe:OleVariant;
begin
dbe:=CreateOleObject('dao.dbengine.36');
dbe.CompactDatabase('D:\a.mdb','d:\b.mdb','',0,';pwd=mima');
end;
//引用ComObj,ActiveX
function TFAutoStat.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;procedure TFAutoStat.ActCompactDBExecute(Sender: TObject);
var
sFileName: String;
begin
sFileName:=ExtractFilePath(Application.ExeName)+'..\DataBase\AutoStat.mdb';
sBarText('正在压缩数据库,请稍候......');
Self.Enabled:=false;
Self.Cursor:=crSqlWait;
try
AdoConnection.Close; //需要断开数据库
if CompactDatabase(sFileName,'1234') then sBarText('压缩数据库完毕')
else ShowMessage('压缩数据库失败!');
ConnectToDB();
finally
Self.Enabled:=true;
Self.Cursor:=crDefault;
end;
end;