打包dbf表时,错误是文件正在使用中

尝试发出请求时,它会显示错误:

  

文件正在使用中

我该如何解决该程序?

 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.

我无法从表中删除数据,它们被标记为已删除但需要打包。如何以编程方式进行?他写道打包该文件时正在使用该文件?

vfc123_vgfgfcv 回答:打包dbf表时,错误是文件正在使用中

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

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

我发现this thread from 2005 on another forum,有人用两个著名的参数完成了这项工作:

  • 使用提供者VFPOLEDB.1
  • 仅使用命令pack filename.dbf(不使用关键字table)。

最后,我不确定ShowMessage(SysErrorMessage(GetLastError));行。这将向您显示最后一个API错误,但级别较低。您正在使用ADO组件,因此,如果出现任何问题,则应期望ADO引发异常。就您所知,ADO已经以一种或另一种方式解决了该问题,并且您看到的错误消息甚至不相关。

,

令我惊讶的是我无法获得Golez Troi的答案中建议的解决方案 可以正常工作,特别是因为它是指某人的新闻组帖子,该人似乎已经设法使用ADO打包dBASE表;正如我在评论中所说,如果我尝试通过ADO调用“ Pack xxxx”来打包dBASE表,但是我做到了

  

无效的SQL语句;预期的删除,插入,过程,选择或更新   

我也很惊讶地注意到MS ODBC dBASE docs中以前没有发现的东西,即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,True));
  finally
    Table1.Close;
    Database1.Connected := False;
  end;
end;

FWIW,在我编写此答案时,我注意到BDE.Int文件(提供声明,但未提供BDE接口的实现)在D7发行CD上,但显然默认情况下未安装)。 / p>

本文链接:https://www.f2er.com/3147117.html

大家都在问