老问题:如何压缩和修复access数据库?(200分)

  • 主题发起人 主题发起人 山水之间
  • 开始时间 开始时间

山水之间

Unregistered / Unconfirmed
GUEST, unregistred user!
这真是个老问题了,我检索了论坛中的问题,学习了不少方法,但无奈本人太愚笨,总是不能编译通过,哪位好心的大哥能详细讲解一下具体步骤。全分送上!
 
先选择Project-->import Type Library
选择Microsoft Jet and Replication Objects 2.6 Library(Version2.6)
或者
Microsoft Jet and Replication Objects 2.5 Library(Version2.5)
点击Install

然后使用下面函数

function getCurPath: string;
begin
Result := ExtractFilePath(Application.ExeName);
end;


procedure CompactDB(const DBname, DBtype, DBpass: string); //DBname数据库名,DBtype:Access数据库类型 值为97或者2000,DBpass:数据库密码
var
MyJetEngine: JetEngine;
strDataSource,
strDataDest,
strDataDestName: string;

begin
if not FileExists(DBname) then
begin
writeln('Error: ''', DBName, ''' not found.');
exit;
end;

// delete any previous temporary mdb file
strDataDestName := ExtractFilePath(DBname) + 'temp.mdb';
if FileExists(StrDataDestName) then
begin
DeleteFile(strDataDestName);
//writeln('Previous temporary file ', strDataDestName, ' deleted.');
end;

strDataSource := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DBname +
';Jet OLEDB:Database Password=' + '"' + DBpass + '"' + ';';
strDataDest := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
strDataDestName + ';Jet OLEDB:Database Password=' + '"' + DBpass + '"' +
';';

// default to Access 2000 format unless 97 format is specified
{ default changed 30 Sep 2000 DRS }
if DBtype = '97' then
// Use Engine Type 4 for Access 97 db
strDataDest := strDataDest + 'Jet OLEDB:Engine Type=4'
else
// Use Engine Type 5 for Access 2000 db
strDataDest := strDataDest + 'Jet OLEDB:Engine Type=5';

MyJetEngine := CoJetEngine.Create();
try
MyJetEngine.CompactDatabase(strDataSource, strDataDest);
//writeln(DBname, ' compacted into ', strDataDestName + '.');
MyJetEngine := nil;
if DeleteFile(DBname) then
begin
// writeln(DBname, ' deleted.');
if RenameFile(strDataDestName, DBName) then
// writeln(strDataDestName, ' renamed ', DBname + '.')
else
// writeln('Error: ', strDataDestName, ' could not be renamed ', DBname, '.');
end
else
// writeln('Error: ', DBname, ' could not be deleted.');
except
//on E: Exception do writeln('Error: ', E.Message);
end
end;

例子:

procedure TfrmMain.Button3Click(Sender: TObject);
begin
dm1.ADOConnection1.Connected := false;
MessageDlg('请点击 OK 开始压缩,请耐心等待! ', mtInformation,
[mbOk], 0);
CompactDB(getCurPath + 'test.mdb', '2000', 'password');
MessageDlg(' 压缩完毕! ', mtInformation,
[mbOk], 0);
dm1.ADOConnection1.Connected := true;

end;
 
这个是数据库压缩
var
dao:OLEVariant;
OldName,tmpName:string;
begin
OldName:=ExtractFilePath(paramstr(0))+'Data/times.mdb';
tmpName:=ExtractFilePath(paramstr(0))+'Data/temps.mdb';
dmMain.ado_cnt.Close;
screen.Cursor:=crHourGlass;
try
dao:=CreateOleObject('DAO.DBEngine.36');
dao.CompactDatabase (OldName, tmpName, '', 0, ';pwd=cctimes');
DeleteFile(OldName);
RenameFile(tmpName,OldName);
dmMain.ado_cnt.Open;
screen.Cursor:=crDefault;
except
screen.Cursor:=crDefault;
dmMain.ado_cnt.Open;
end;

end;
 
完美解决方案
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1268352
 
to 山泉:
我这样做时:
先选择Project-->import Type Library
选择Microsoft Jet and Replication Objects 2.6 Library(Version2.6)
点击Install
,系统要求编译jro_tlb,编译出错,显示[Error] JRO_TLB.pas(594): Undeclared identifier: 'ActiveConnection'
是什么原因?[:(][:(][:(]
 
to 816:
编译dao:=CreateOleObject('DAO.DBEngine.36');时出错;
我在import microsoft dao 3.6 时,提示说不能加载.dll文件,而用microsoft dao 3.5 则可以,但要求编译,也是出错,与用Microsoft Jet and Replication Objects 2.6 Library(Version2.6)一样。有什么办法解决?
 
山水之间
你打开delphi ,关闭所有delphi窗体,
先选择Project-->import Type Library
选择Microsoft Jet and Replication Objects 2.6 Library(Version2.6)
选择Create Unit 后,再Install 看看
记住把生成的Unit 的路径给delphi->tools->Envirorment->Library
把他当作当作delphi组件安装
 
老大,怎么不试试我的方法?根本不用导入什么类库呀

问题:在Delphi中用ADO压缩Access数据库之不引用JRO类型库方法

看到很多富翁提出类似问题,给出一个比较好的解决方法
第一个参数为原始数据库文件名(完整路径),第二个参数为密码
修改后可以实现压缩后与压缩前有不同的密码!
//引用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;
 
to 山泉:
如何操作:把生成的Unit 的路径给delphi->tools->Envirorment->Library?其它的我都是按你的提示做的,在install 对话框中,选择install existing package 还是new package? filename是否用它的缺省值,还是用你说的delphi6/tools/environment/library?
 
to ysai:
thank you! 我一开始总是在用导入类型库的方法,可是试了很久都没有成功,你的方法我已经copy下来,但刚才还没有try。现在已经成功!非常感谢!
 
感谢ysai提供的方案,同时也感谢山泉的帮助!
 
后退
顶部