您应该执行该语句,而不是将其作为查询打开。一种实现方法是使用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