0

Delphi 2007 の古い FoxPro 2.6 テーブルに接続して
います。BDE をインストールし、フォームに TTable を配置しました。

1 つのテーブルが機能しない を
に 設定し、databasenameテーブルc:\datadir名を に設定し
ますcontacts.dbf

active を true に設定すると、

インデックス記述子が無効です。

別のテーブルが正常
に動作する 正常にロードさ れる別のテーブルがarticle.dbfあり、元のプログラムでもすべて正常に動作します。

これが私が試し
たことです。元のプログラムのすべてのインデックスを再作成しましたが、違いはありません。
実際、Foxpro からの診断では、すべて問題ないことが示されています。
テーブルにはそれほど多くのレコードがないため、インデックスはあまり気にしません。
プロパティを設定しようとしましindexfileたが、それは役に立ちません。

Delphi がテーブルに接続するだけで、インデックスについて不平を言うのをやめるにはどうすればよいですか?

4

2 に答える 2

3

おそらく、contacts.dbf テーブルには、BDE で評価できない式インデックスが含まれています。ここに私が見つけた説明がありますここ

質問: BDE でサポートされていない FoxPro インデックスの種類は何ですか? 一部のテーブルを開こうとすると、「無効なインデックス記述子」エラーが発生します。

回答: このエラーは、テーブルに関連付けられたプロダクション インデックス (.CDX) に、BDE が評価できない式を持つインデックス タグがある場合に発生します。解決策は、FoxPro を使用してタグを削除し、BDE が理解できる同等のインデックスを作成することです。

次の条件は BDE でサポートされておらず、「無効なインデックス記述子」エラーが発生します。

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 に答える