На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> "Corrupt table/index header" при запросе
    Добрый вечер.

    Имеется база данных (DBaseIV/BDE). Поля в базе создаются динамически (в зависимости от настроек программы). База подключается и отображается в сетке на форме (среда разработки Borland Delphi 7). При попытке выполнения запроса к этой базе выдается ошибка:

    "Project ... raised exception class EDBEngineError with message 'Index does not exist. Corrupt table/index header.
    File: [путь_к_файлу]_file.dbt (собственно сама БД)
    File or directory does not exist.
    File: [путь_к_файлу]_file.dbX
    File: [путь_к_файлу]_file.MDX. Process stoped. И т.д. и т.п.'"

    Так вот. Сам файл я проверял открытием в программе просмотра БД. Все с ним в порядке (в программе БД тоже отображается нормально). Индекс для этой БД тоже есть ("file.cdx").

    Каждый день после работы с проектом я делаю бэкап последнего. Открыл копию от 16.10 и запустил скомпиленый exe. Все работает. Перекомпилил эту копию - та же ошибка. В чем может быть дело?
      file.dbt это не файл "базы" а мемо поля
      file.cdx это не dBase, а ФоксПро
        Цитата ReLock @
        В чем может быть дело?

        В
        Цитата ReLock @
        'Index does not exist

        Как создаешь, как удаляешь?
          Цитата Anatoly Podgoretsky @
          file.dbt это не файл "базы" а мемо поля
          file.cdx это не dBase, а ФоксПро

          file.dbt - это просто шаблон. Я могу написать "file.xxx". Это дела не меняет. У меня в структуре при создании БД указан тип: DBASEIV. Я специально поменял расширение, чтобы небыло привязки иконки к DBF. Хотелось сделать свою иконку. Так сказать: DBT - "Database Tournament".

          to BAS:
          Активация и индексация:
          ExpandedWrap disabled
            cIndex:= ChangeFileExt(ExtractFileName(TourFName),'.cdx');
            DataSet.Active := True;
            SetIndexTable(cIndex,'LNAME','LNAME + FNAME','Tables',DataSet, True);

          Процедура индексации:
          ExpandedWrap disabled
            procedure SetIndexTable(FIndex,NIndex,EIndex,DIndex: String; FDataSet: THalcyonDataSet; SortAscending: Boolean);
            var
              SortDir: TgsSortStatus;
              FName: String;
            begin
              FName := AppPath + DIndex + '\' + FIndex;
              if FileExists(FName) then DeleteFile(FName);
             
              with FDataSet do
                if Active then
                  begin
                    if SortAscending = True then
                      SortDir:= halcn6db.Ascending
                    else
                      SortDir:= halcn6db.Descending;
                    IndexFiles.Clear;
                    IndexOn(FIndex,NIndex,EIndex,'',halcn6db.Duplicates,SortDir);
                    IndexFiles.Add(FIndex);
                    IndexName := NIndex
                  end;
            end;


          Сам запрос:
          ExpandedWrap disabled
            Query.DatabaseName := MainForm.DataSet.DatabaseName;
              SQLText := SQLText + 'SELECT ID,NUMBER,STATE,LNAME,FNAME,SNAME,VIRTUAL,TPOINTS ';
              SQLText := SQLText + 'FROM "' + MainForm.DataSet.TableName + '" ';
              SQLText := SQLText + 'WHERE STATE = 1 ';
              SQLText := SQLText + SortVariant;
              Query.SQL.Clear;
              Query.SQL.Add(SQLText);
              Query.Open;


          Добавлено
          Хотелось бы напомнить, что 3-4 дня назад все отлично работало при такой структуре. Вчера заметил такой ньюанс. Когда запускаю программу и создаю новую базу, то с ней все в порядке (можно даже выполнять к ней запросы). Но как только я добавляю в нее новые записи, либо я закрываю программу и подключаю базу снова - происходит вышеописанная ошибка. После ошибки база отключается. В структуре БД повреждений нет. Поключается свободно и все данные из нее в программе отображаются корректно.
          Сообщение отредактировано: ReLock -
            Вообщем разобрался с этой проблемой. Только есть некоторые непонятные вещи. Может кто-нибудь сможет объяснить эти явления? :?:
            Короче дело вот в чем:

            Из полного имени файла конфигурации, который лежит в другом каталоге (имя файла конфигурации и имя БД идентичны, просто лежат в разных каталогах), вытаскивается только имя и меняется расширение на CDX:
            ExpandedWrap disabled
              cIndex:= ChangeFileExt(ExtractFileName(TourFName),'.cdx');

            База данных становится активной:
            ExpandedWrap disabled
              DataSet.Active := True;

            База индексируется:
            ExpandedWrap disabled
              SetIndexTable(cIndex,'LNAME','LNAME + FNAME','Tables',DataSet, True);

            После этих действий в каталоге с базой данных создается индекс для этой БД и в заголовке БД-файла выставляется признак, что "используется индекс". База индексируется. Но в этом случае при попытке выполнить к этой БД запрос - выходит вышеописанная ошибка.

            Если же сделать так:

            Формирую новое расширение (полный путь остается):
            ExpandedWrap disabled
              cIndex:= ChangeFileExt(TourFName,'.cdx');

            База данных становится активной:
            ExpandedWrap disabled
              DataSet.Active := True;

            База индексируется:
            ExpandedWrap disabled
              SetIndexTable(cIndex,'LNAME','LNAME + FNAME','Tables',DataSet, True);

            После этих действий в каталоге с файлом конфигурации создается индекс для БД и в заголовке БД-файла НЕ выставляется признак, что "используется индекс". База индексируется. И только В ЭТОМ случае к базе можно применить запрос.

            :?: :?: :?:
              ;) Ура! Все разобрал. Короче дело вот в чем:

              - если у базы расширение <DBF>, то можно смело делать для нее индекс в том же каталоге. К заголовке файла выставится признак, что база инпользует индекс и к ней можно делать любые запросы.

              - если же у базы расширение, отличное от DBF (например, XXX), то при создании индекса для этой базы в том же каталоге (в заголовок файла опять же выставится признак, что база использует индекс) - к этой базе нельзя применить запрос (BDE ругается на заголовок базы и индекса, мол поврежден). Для этого случая единственным решением будет создать для базы индекс в другом каталоге (в заголовок файла не запишется, что база использует индексы, зато к ней можно применить любые запросы).

              Вот такая вот кухня.

              Добавлено
              Все! Тема закрыта.
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0.0720 ]   [ 15 queries used ]   [ Generated: 25.07.26, 15:05 GMT ]