急,如何压缩数据Access数据库。(10分)

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
我编写了几个小软件,数据库都是用的Access数据库,但是Access数据库,用了不久,
数据库就会变大。微软的office里的Access软件里的工具里有一项可以用来压缩数据库,
我注意里一下,原来900多k的数据库压缩一下,就变成100多k。
我现在想脱离office的Access里的自带的压缩数据库的功能,用delphi来实现压缩Access数据
库。如何实现。
 
兄弟,分数是不是有点少?
 
兄弟, 上论坛要学会检索。 这个问题在这个论坛中被问及不下数十次......
 
myPath := ExtractFileDir(Application.ExeName)+'/school.mdb' ;
daocompactdb(myPath);
 
本想把刚学来的方法告诉你,无奈钱太少了,划不来
 
CompactDatabase函数
你查查MSDN吧
我VB里面用过
DELPHI还不熟
 
www.codelphi.com首页就有
 
山水之间朋友,您好,不是我不想给分,我不懂的问题太多,问的分快没有了,你帮我一下,
下次我只要看见你回答我问题了,一定多送点分给你。
 
利用 ADO 压缩和修复MS Access 2000数据库
cxs


摘 要:利用 ADO 压缩和修复MS Access 2000数据库
关键字:ADO 压缩 MS Access 2000 数据库
类 别:数据库


CoDelphi.com版权所有,未经允许,不得进行任何形式转载


上次发表了一篇关于压缩和修复MS Access 2000文件的文章,得到网友的好评,在此深表感谢。下面再奉献一篇利用 ADO 压缩和修复MS Access 2000文件的文章,希望能对您有所帮助。

首先定义一个函数:

function TForm1.compressdatabase:boolean;const sProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;';var sOldMDB,sNewMDB:string; MyObj:variant;begin result:=false; OldFileName:='Delphi资料库.mdb'; NewFileName:='Delphi资料库.mdb1'; sOldMDB := sProvider + 'Data Source=' + OldFileName; sNewMDB := sProvider + 'Data Source=' + NewFileName; MyObj:=createoleobject('jro.jetengine.2.1'); try try MyObj.CompactDatabase(sOldMDB, sNewMDB); result:=true; except result:=false; MyObj:=null; end; finally MyObj:=null; end;end;



调用示例:


Var OldFileName,NewFileName:string; //全局变量procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin ADOConnection1.Connected :=false; //调用之前必须先关闭数据库连接 if not n1.Checked then exit; //假若“关闭时压缩数据库”为假,则退出 try if not CompressDatabase then begin ShowMessage(' 压缩数据库失败! '); exit else ShowMessage(' 压缩数据库成功! '); if DeleteFile(OldFileName) then RenameFile(NewFileName,OldFileName); else ShowMessage('不能重命名文件'); finally// OldFileName:='';// NewFileName:=''; end;end;



注意:
1- 在你的uses语句中必须加入ComCtrls单元。

2- 在压缩的过程中,其它人不能打开或使用数据库。

3- 修复压缩数据库时,若出现“类字符串无效”。
原 因 是:用户计算机中没有或者未注册“MSJRO.DLL”文件。
解决办法:若$(system)目录中没有上述文件,则复制该文件到$(system)目录下;若$(system)目录有上述文件,那么在$(system)目录下执行下列命令:
regsvr32 MSJRO.dll
若还出现“类字符串无效” 请尝试将“MyObj:=createoleobject('jro.jetengine.2.1');”一句改为:
MyObj:=createoleobject('jro.jetengine');
注:$(system)目录,即为用户计算机中操作系统的系统目录。如:“C:/Windows/System” 。

投稿人:cxs 投稿日期:2002-12-24 12:56:
 

function TQDate.CompactAndRepair(sOldMDB: string; sNewMDB: string): Boolean;
const
sProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;';
var
oJetEng: JetEngine;
begin
DataModule2.ADOConnection1.Connected := false;
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;
 
看在曾经同病相怜的份上...
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对象超过作用域自动释放
// JE.closedatabase(SConnectionString);
OleCheck(JE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord])));//压缩数据库
//复制并覆盖源数据库文件,如果复制失败则函数返回假,压缩成功但没有达到函数的功能
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);//删除临时文件
// JE.opendatabase(SConnectionString);
except
result:=false;//压缩失败
end;

end;
这是个好方法啊!!什么都不用调用和安装!
 
山水之间朋友,很感谢您提供的代码,只是您的代码编译不能成功。
其中:
JE:=CreateOleObject('JRO.JetEngine');//建立OLE对象,函数结束OLE对象超过作用域自动释放
这句话不能通过。
--------------------------------------------------------------------------
孔明朋友的jetEngine类型不存在;
oJetEng: JetEngine;
---------------------
我在uses里添加了 oleedb,comctrls,都没用;
 
有谁能根本解决这个问题啊?上面的代码我都试过很多遍了,确实不能编译成功。
我真的没有办法了,我知道上面提供的代码基本都是对的,可能只是一点点的小问题。
哪位朋友帮我调试一下,把能够编译成功的代码发给我。谢谢啦!
 
山水之间朋友,你提供的代码,刚才我调试成功了,要在uses里加上 ComObj,ActiveX ;
uses 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;
 
对不起,忘了uses这一点了.前一阵子没来看,今天才来,不过你已经解决了.我很高兴
 
多谢各位朋友的帮助。
 
顶部