Delphi中如何对Access2000进行压缩与修复?(200分)

  • 主题发起人 主题发起人 qiangyuan
  • 开始时间 开始时间
Q

qiangyuan

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi对Access97可以通过DAO进行压缩和修复,但是对Access2000如何操作呢?(最好是
通过ADO控件操作)不知高手们是否有过这方面的经验,愿闻其详!
另外想了解一下如何访问有密码的Access2000,这一点来说,对Access97的操作也是不能
继承。
 
function daocompactdb:boolean; //compactdatabase
var
srcfile,dstfile:widestring;
db:_DBEngine;
dtbs:database;
begin
srcfile:=extractfilepath(application.ExeName)+'agritax.mdb';
dstfile:=extractfilepath(application.ExeName)+'tempfile.mdb';

try
try
db:=coDBEngine.Create;
dtbs:=db.OpenDatabase(srcfile,true,false,';pwd=agriculture');
dtbs.NewPassword('agriculture','');
dtbs.Close;
dtmd.DataModule1.adocntion.Connected:=false;
db.CompactDatabase(srcfile,dstfile,emptyparam,emptyparam,'');
// db.CompactDatabase(srcfile,dstfile,emptyparam,emptyparam,'agriculture');
dtmd.DataModule1.adocntion.Connected:=false;

if not copyfile(pchar(dstfile),pchar(srcfile),false) then
begin
deletefile(dstfile);

result:=false;

exit;
end;

finally
dtbs:=db.OpenDatabase(srcfile,true,false,';pwd=');
dtbs.NewPassword('','agriculture');
dtbs.Close;
dtmd.DataModule1.adocntion.Connected:=true;
end;
//dtmd.DataModule1.adocntion.Connected:=true;
result:=true;
except // wrap up
dtmd.DataModule1.adocntion.Connected:=true;
result:=false;
dtmd.DataModule1.adocntion.Connected:=true;
end; // try/except
deletefile(dstfile);
dtmd.DataModule1.adocntion.Connected:=true;

end;
function daorepairdb:boolean; //repairdatabase
var
db:_DBEngine;
begin
db:=coDBEngine.Create;
try
db.RepairDatabase(extractfilepath(application.ExeName)+'agritax.mdb');
result:=true;
except

result:=false;
end;
end;

 
关于ACCESS2000的密码
连接串:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/My Documents/db1.mdb;Persist Security Info=False;Jet OLEDB:Database Password=123"

1。在设置AdoConnection的连接串时,在Data Link Properties 对话框的connection页面中指定好MDB的路径后,并不在此页面中
设置密码,即仍然选中Blank Password选项
2。然后在all页面中,修改Jet Oledb:Database Password 的值。
 
关于压缩问题
上述中
:_DBEngine;
:database;是什么类型的变量,在哪里找。还有OpenDatabase函数如果没有密码时最后一个参数设置成什么。
谢谢!
 
to :antic_ant
你的database、:_DBEngine等类型好象在delphi定义中找不到嘛,是自编的吗?
 
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=I:/Delphi_Books/delphibbs9.mdb;Persist Security Info=False
 
这个简单可行:
uses ....,ComObj;
..
..

procedure Tfm_main.Compact;
var dao:OLEVariant;
begin
adoconnection.Close;
screen.Cursor:=crHourGlass;
dao:=CreateOleObject('DAO.DBEngine.36');
dao.CompactDatabase(getcurrentdir+'/data.mdb',getcurrentdir+'/new.mdb');
DeleteFile(getcurrentdir+'/data.mdb');
RenameFile(getcurrentdir+'/new.mdb','data.mdb');
adoconnection.Open;
screen.Cursor:=crDefault;
application.MessageBox('成功压缩数据库','提示',mb_ok+mb_iconinformation);
end;
 
:_DBEngine这是在dao97单元里面声名的(Access97)
Access2000中也有,不过叫dao?没查
 
PROCEDURE TFORM1.COMPACTDB(SRC,DST:STRING);
var
JetEng:JetEngine;
const
sProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;';
begin
sRC := sProvider + 'Data Source=' + SRC;
DST := sProvider + 'Data Source=' + DST;

JetEng:=CoJetEngine.Create;
try
JetEng.CompactDatabase(SRC,dst);

finally
FreeAndNil(JetEng);
end;
end;

在uses 中加入JRO_TLB
在PROJECT 菜单中选择IMPORT TYPE LIBARAY,导入MICROSOFT JET AND REPLICATION OBJECTS
即可
 
压缩带密码的Accsee2000方法如下:
请在USES中加入JRO_TLB
在JRO_TLB可以在PROJECT 菜单中选择IMPORT TYPE LIBARAY,导入MICROSOFT JET AND REPLICATION OBJECTS后得到。
var
jt:TJetEngine;
pnstr:string;
begin
pnstr:=extractfilepath(application.ExeName);
jt:=TjetEngine.Create(self);
try
jt.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+pnstr+'Sour.mdb;Jet OLEDB:DataBase PassWord=****',
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+pnstr+'Dest.mdb;Jet OLEDB:DataBase PassWord=****');

DeleteFile(pnstr+Sour.mdb');
RenameFile(pnstr+Sour.mdb',pnstr+Dest.mdb');
finally
jt.Free;
screen.Cursor:=crdefault;
end;
 
stjsq 可以压缩删除的记录(正解之一)
 
原来调用DAO仍然可以解决。感谢antic_ant、chinaplate、stjsq、wangfei1234567、huifi!
我采用了stjsq的方法和chinaplate的解密并一次性搞定,其他人还没测试。
再次感谢诸位的捧场。
 
多人接受答案了。
 
后退
顶部