Я получаю неверный дескриптор индекса при использовании древних таблиц FoxPro 2.6 - PullRequest
0 голосов
/ 15 мая 2011

Я подключаюсь к старым таблицам FoxPro 2.6 в Delphi 2007.
Я установил BDE и поместил TTable в форму.

Одна таблица не работает
Установите databasename на c:\datadir и
Имя таблицы на contacts.dbf.

Когда я установлюactive to true, я получаю

неверный дескриптор индекса.

Другая таблица работает нормально
У меня есть другая таблица с именем article.dbf, котораязагружается нормально, и в оригинальной программе все тоже отлично работает.

Вот что я попробовал
Я уже переиндексировал все в исходной программе, но это не имеет значения.
На самом деле диагностика от Foxpro говоритчто все в порядке.
Меня не волнуют какие-либо индексы, потому что в таблице не так много записей.
Я пытался установить свойство indexfile, но это не помогает.

Как заставить Delphi просто подключиться к таблице и перестать жаловаться на индексы?

Ответы [ 2 ]

3 голосов
/ 15 мая 2011

Возможно, ваша таблица contacts.dbf содержит индекс выражения, который не может быть оценен BDE.Вот объяснение, которое я нашел здесь

Вопрос: Какие типы индексов FoxPro не поддерживаются BDE?При попытке открыть несколько таблиц я получаю сообщение об ошибке «Недопустимый дескриптор индекса».

Ответ. Эта ошибка возникает, когда производственный индекс (.CDX), связанный с таблицей, имеет индексный тег с выражением, которым является BDEне могу оценить.Решение состоит в том, чтобы удалить тег с помощью FoxPro и создать эквивалентный индекс, понятный BDE.

Следующие условия не поддерживаются BDE и приводят к ошибке «Недопустимый дескриптор индекса».

DTOC (, 1) формат не поддерживается;Используйте DTOC ().Функция ALLTRIM не поддерживается;Использовать LTRIM (RTRIM (поле)).

2 голосов
/ 16 мая 2011

Вот код, который описал 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;
...