adotable 关闭释放文件的问题

aaa2520 2010-08-04 09:57:33
用adotable 访问 一个access 数据库,当我 调用close ,下一条语句去访问 这个access 数据库文件时 提示 access 文件被独占打开,
如果我再 close table 后 加入一个条 sleep(10000)再访问这个文件,就可以了,难道是
ado close 释放文件很慢?
有别的解决方法吗?
...全文
121 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodhj 2010-08-04
  • 打赏
  • 举报
回复
都说了,你是通过Adoconnection组件连的Access吧?只要你AdoTable打开过一次,Adoconnection的Connected就变成了True,即使你AdoTable关闭了也是一样,那他就一直独占Access
aaa2520 2010-08-04
  • 打赏
  • 举报
回复
????????????????????
aaa2520 2010-08-04
  • 打赏
  • 举报
回复
多谢 各位老大。
我又测试 了测试,发现这样的问题
用一个 dbadvgrid 连接到 adotable 上
程序 默认 adotable 是关闭的 这个时候 我调用 DaoCompactDB('d:\check\data.mdb') 是成功的
当我
用adotable。open 一次后
我再
adotable.close;
DaoCompactDB('d:\check\data.mdb') ;
提示 已经被独占打开,不能再打开,难道 是adotable。close 没效果,但是dbadvgrid ,上面已经不显示数据了

老大们 这是怎么回事?
kye_jufei 2010-08-04
  • 打赏
  • 举报
回复
找了下之前寫的代碼,LZ參考一下吧:


Const
SConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
+'Jet OLEDB:Database Password=%s;';
function GetTempPathFileName():string;
//取得临时文件名
var
SPath,Sfile:array [0..254] of char;
begin
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
result:=SFile;
DeleteFile(PChar(result));
end;
function CompactDatabase(AFileName,APassWord:string):boolean;
//压缩与修复数据库,覆盖源文件
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
except
result:=false;
end;
end;

//调用函数
procedure Tfrmcompact.SpeedButton2Click(Sender: TObject);
begin
if edit1.text='' then
begin
MessageBox(handle,'请选择要压缩的数据库文件!','提示',MB_OK + MB_ICONINFORMATION);
end
else begin
compactdatabase(edit1.text,'');
MessageBox(handle,'数据库压缩成功!','成功',MB_OK or MB_ICONINFORMATION);
edit1.Text:='';
end;
end;
//数据库备份
procedure Tfrmbackup.SpeedButton1Click(Sender: TObject);
begin
if edit1.text='' then
begin
MessageBox(handle,'请选择现有的数据库!','提示',MB_OK + MB_ICONINFORMATION);
end
else begin
if edit2.text='' then
begin
MessageBox(handle,'请选择备份数据库的路径!','提示',MB_OK + MB_ICONINFORMATION);
end
else begin
copyfile(pchar(edit1.text),pchar(edit2.text),false);
MessageBox(handle,'数据库备份成功!','成功',MB_OK or MB_ICONINFORMATION);
edit1.Text:='';
edit2.Text:='';
end;
end;
end;
goodhj 2010-08-04
  • 打赏
  • 举报
回复
myadd.Close;
mydec.Close;
adotable4.Close;
adotable3.Close;
adotable2.Close;
adotable1.Close;
adoquery1.Close;

Adoconnection.Close;
Application.ProcessMessages;

if DaoCompactDB('d:\check\data.mdb') then
aaa2520 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kye_jufei 的回复:]
不過,

Delphi(Pascal) code
在设置的时候,你所用的TTable或者其他的控件的active属性不要设置为true,要不然在这个时候“文件已经在使用了”,用代码写 Table1.active:=true;
这样在运行时候才打开表,就不会出问题了...

你肯定是在设置的时候就将要连接的表打开了,例如:在dbgrid中显示表的内容等...
[/Quote]

好像是这个问题
dbgrid 怎么断开?
kye_jufei 2010-08-04
  • 打赏
  • 举报
回复
原來你壓縮獨佔出錯?


通過JRO壓縮資料庫
  procedure TForm1.btnCompactDBClick(Sender:TObject);
  var
  JetEngine:IJetEngine;
  strTagCon:string;//目標資料庫連接字串
  strSourceCon:string;//源資料庫連接字串
  begin
  JetEngine:=CoJetEngine.Create;
  strSourceCon:=
  'Provider=Microsoft.Jet.OleDB.4.0;'
  +'Data Source=d:ComTestmyDb.mdb;'
  +'Jet OLEDB:Engine Type=5;'
  +'Locale Identifier=0x0804;'
  +'Jet OLEDB:Database Password=mypwd';
  strTagCon:=
  'Provider=Microsoft.Jet.OleDB.4.0;'
  +'Data Source=d:ComTestmyDb1.mdb;'
  +'Jet OLEDB:Engine Type=5;'
  +'Locale Identifier=0x0804;'
  +'Jet OLEDB:Database Password=mypwd';
  //可以以此改變資料庫密碼
  JetEngine.Compact Database(str Source Con,str TagCon);
  end;
aaa2520 2010-08-04
  • 打赏
  • 举报
回复
myadd.Close;
mydec.Close;
adotable4.Close;
adotable3.Close;
adotable2.Close;
adotable1.Close;
adoquery1.Close;
sleep(10000);
if DaoCompactDB('d:\check\data.mdb') then
showmessage('压缩成功')
else
showmessage('压缩失败');
DaoCompactDB 里面要访问access 文件,
没有 sleep 我用 delphi 单步调试也没问题,

goodhj 2010-08-04
  • 打赏
  • 举报
回复
sleep(10000)再访问这个文件,就可以了。。。
那你Close后加一句Application.ProcessMessages
kye_jufei 2010-08-04
  • 打赏
  • 举报
回复
不過,
在设置的时候,你所用的TTable或者其他的控件的active属性不要设置为true,要不然在这个时候“文件已经在使用了”,用代码写   Table1.active:=true; 
这样在运行时候才打开表,就不会出问题了...

你肯定是在设置的时候就将要连接的表打开了,例如:在dbgrid中显示表的内容等...
kye_jufei 2010-08-04
  • 打赏
  • 举报
回复

你的數據庫已經被獨佔方式打開;因此,下一條語句訪問數據時會提示出錯:
不是釋放的問題,很可能是你程序代碼的問題;把代碼貼出來看一看,無代碼無真相...
aaa2520 2010-08-04
  • 打赏
  • 举报
回复
close后 调用 sleep 几秒后,为什么就可以访问了? 没有释放窗口
goodhj 2010-08-04
  • 打赏
  • 举报
回复
表Close没用,Connection还连接那表呢。。。呵呵 如果你用AdoTable直接连的那就只好把你窗体释放掉,如果你用AdoConnection连接的,那把AdoConnection关掉看看,不行的话就把那窗体释放掉,肯定就放掉独占了
aaa2520 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 goodhj 的回复:]
我的神啊,你居然直接用AdoTable连的,换成用Adoconnection连,然后设置AdoTable的Connection属性吧,
Adoconnection.Close;
Application.ProcessMessages;
if DaoCompactDB('d:\check\data.mdb') then
保证不出文件正在使用的提示
[/Quote]
AdoTableAdoTable 和 Adoconnection 有什么区别啊?
这样不是少用一个控件吗?
goodhj 2010-08-04
  • 打赏
  • 举报
回复
我的神啊,你居然直接用AdoTable连的,换成用Adoconnection连,然后设置AdoTable的Connection属性吧,
Adoconnection.Close;
Application.ProcessMessages;
if DaoCompactDB('d:\check\data.mdb') then
保证不出文件正在使用的提示
aaa2520 2010-08-04
  • 打赏
  • 举报
回复
那 我有什么办法 关闭 Adoconnection ?
我直接用的 adotable

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧