打包dbf表时,出现一个错误is文件正在使用中



当尝试发出请求时,它显示一个错误:

文件正在使用

如何解决该程序?

procedure TForm1.Button4Click(Sender: TObject);
var data,ffg:string;
begin
data:=formatdatetime('ddmm',(DateTimePicker1.Date));
Adoquery2.SQL.Clear;
adoquery2.SQL.text:='Delete from g_rabn where data=data';// deleting data from g_rabn
adoquery2.ExecSQL;
ShowMessage(SysErrorMessage(GetLastError));
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
Adoquery3.close;
Adoquery3.SQL.Clear;
adoquery3.SQl.text:='pack table g_rabn';// packing tablr g_rabn
adoquery3.Open;
ShowMessage(SysErrorMessage(GetLastError));
end;
end.

我不能从表中删除数据,它们被标记为已删除,但需要打包。如何通过编程实现?他写那个文件在用的时候打包该怎么办?

您应该执行该语句,而不是将其作为查询打开。实现这一点的一种方法是使用TADOCommand而不是TADOQuery来运行它,或者使用TADOQuery的ExecSQL方法。

此外,与DBF的所有其他连接都必须关闭,否则您无法获得打包表所需的独占访问权限。

我在2005年的另一个论坛上发现了这个帖子,有人用两个显著的参数做了这个工作:

  • 使用提供程序VFPOLEDB.1
  • 只使用命令pack filename.dbf(没有table关键字(

最后,我对ShowMessage(SysErrorMessage(GetLastError));行不太确定。这将向您显示最后一个API错误,但这是一个低级别的错误。您正在使用ADO组件,所以如果出现任何问题,您应该期望ADO抛出异常。据您所知,ADO已经以某种方式解决了这个问题,您看到的错误消息甚至与此无关。

我很惊讶我没有得到Golez Troi的答案中建议的解决方案工作,特别是当它指的是一个新闻组的帖子,某人似乎设法使用ADO打包了一个dBASE表;正如我在评论中所说,如果我试图通过ADO调用"Pack xxxx"来打包dBASE表,无论我怎么做,我都会得到

无效的SQL语句;应为DELETE、INSERT、PROCEDURE、SELECT或UPDATE.

我还惊讶地注意到MS ODBC dBASE文档中有一些我以前没有注意到的内容,即dBASE文件的MS ODBC驱动程序需要BDE

注意通过ODBC桌面数据库驱动程序访问dBASE ISAM文件需要安装Borland数据库引擎

因此,由于通过Ado访问dBASE文件无论如何都需要BDE,在我看来没有必要避免使用BDE来使用标准BDE方法封装dBASE表,即调用DbiPackTable。我添加了一个TDatabase和TTable到我的ADO测试项目,之后我能够执行此代码而没有任何问题

procedure TForm1.Button2Click(Sender: TObject);
begin
try
//  Insert code here to close any Ado object (TAdoConnection, TAdoCommand, etc) pointing
//  at the dBASE table/file
//  Also check that not Ado object pointing at it is open in the IDE
//
//  Then ...
Database1.DatabaseName := 'MADBF2';
Database1.Connected := True;
Table1.TableName := 'MATest.Dbf';
Table1.Exclusive := True;
Table1.Open;
//  Following uses a call to DbiPackTable to pack the target table
Check(DbiPackTable(Table1.DBHandle, Table1.Handle, nil, nil,True));
finally
Table1.Close;
Database1.Connected := False;
end;
end;

FWIW,当我写这个答案时,我注意到BDE.Int文件(它给出了声明,但没有实现BDE接口(在D7发行版CD上,但显然默认情况下没有安装(。

相关内容

最新更新