以下是我使用的一段压缩、备份、还原的子程序,供参考!
procedure TDM.BackRevertShrinkDB(const AOperType: Byte; const AFileName: string);
const
ConnectStr='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB
atabase Password=%s;';
var
V:OleVariant;
SourcePW,DestPW,
SourceDB,DestDB,Temp:string;
begin
case AOperType of
0:
begin//0表示备份:新的数据库密码需要计算,旧数据库密码=固定
SourcePW:=pwDataBase;
DestPW:=pwNewDataBase;
SourceDB:=FSetupPath+KDCDBName;
DestDB:=AFileName;
end;
1:
begin//1表示恢复数据库:源密码需要计算,目标数据库密码固定
SourcePW:=pwNewDataBase;
DestPW:=pwDataBase;
SourceDB:=AFileName;
if not FileExists(SourceDB) then RaiseError('用于恢复的数据库文件不存在!');
DestDB:=FSetupPath+KDCDBName;
end;
else
begin
SourcePW:=pwDataBase; //否则表示压缩数据库
DestPW:=pwDataBase;
SourceDB:=FSetupPath+KDCDBName;//'SmartMeterKDC.mdf';
DestDB:=FSetupPath+FloatToStr(Now);
end;
end;
if FileExists(DestDB) then //确保目标文件不存在。如果是还原,先将原来的数据库改名
if AOperType=1 then //还原
begin
Temp:=FSetupPath+'SmartMeterKDC.PreRst'; //改名
if FileExists(Temp) then DeleteFile(Temp); //改名的文件存在
RenameFile(DestDB,Temp); //如果是还原,失败的话应恢复。//FSetupPath+SmartMeterKDC.PreRst
end else DeleteFile(DestDB); //如果是备份,删除目标文件,如果是压缩,删除临时文件。
try
V:=CreateOleObject('JRO.JetEngine');
OleCheck(V.CompactDatabase(Format(ConnectStr,[SourceDB,SourcePW]),Format(ConnectStr,[DestDB,DestPW])));//压缩数据库
if AOperType>1 then//备份不对源文件和目标文件进行操作
begin //压缩应将结果文件改名为数据库文件
DeleteFile(SourceDB);//删除
RenameFile(DestDB,SourceDB);
end else if AOperType=1 then DeleteFile(Temp);////如果是恢复,恢复成功后应删除刚才的改名文件
except
if AOperType=1 then RenameFile(Temp,DestDB);
raise;
end;
end;