0

我正在连接到 Delphi 2007 中的旧 FoxPro 2.6 表。
我已经安装了 BDE 并在表单上放置了一个 TTable。

一个表不起作用
databasenametoc:\datadir
The tablename 设置为contacts.dbf

当我将 active 设置为 true 时,我得到

无效的索引描述符。

另一个表工作正常
我有另一个名为article.dbf加载正常的表,并且在原始程序中一切正常。

这是我尝试过的
我已经重新索引了原始程序中的所有内容,但这没有什么区别。
事实上,Foxpro 的诊断表明一切正常。
我并不真正关心任何索引,因为表中没有那么多记录。
我试过设置indexfile属性,但这没有帮助。

如何让 Delphi 连接到表并停止抱怨索引?

4

2 回答 2

3

可能您的 contacts.dbf 表包含 BDE 无法评估的表达式索引。这是我在这里找到的解释

问:BDE 不支持哪些类型的 FoxPro 索引?尝试打开某些表时,我收到“无效索引描述符”错误。

回答:当与表关联的生产索引 (.CDX) 的索引标记具有 BDE 无法计算的表达式时,会发生此错误。解决方法是删除标签,使用 FoxPro 创建一个 BDE 可以理解的等效索引。

BDE 不支持以下条件,会导致“Invalid Index Descriptor”错误。

不支持 DTOC(, 1) 格式;使用 DTOC()。不支持 ALLTRIM 函数;使用 LTRIM(RTRIM(字段))。

于 2011-05-15T14:08:50.983 回答
2

这是 Sertac 描述的代码,它将从标头中删除自动打开 CDX 标志。当然,首先制作数据库的副本

var
  Stream: TFileStream;
  ByteRead: Byte;
begin
  Stream := TFileStream.Create("YourFile.dbf", fmOpenReadWrite or fmShareDenyNone);
  try
    // Byte offset 28 has a value of 0x01 if a structural (auto-open) index exists,
    // or 0x00 if no such index exists. If the value is not set, we do nothing.
    Stream.Position := 28;
    Stream.Read(ByteRead, SizeOf(ByteRead));
    if ByteRead = 1 then
    begin
      ByteRead := 0;
      Stream.Position := 28;
      Stream.Write(ByteRead, SizeOf(Byte));
    end;
  finally
    Stream.Free;
  end;
end;
于 2011-05-16T12:59:16.520 回答