"Corrupt table/index header" при запросе
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.91] |
|
|
ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
"Corrupt table/index header" при запросе
|
Сообщ.
#1
,
|
|
|
|
Добрый вечер.
Имеется база данных (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. Все работает. Перекомпилил эту копию - та же ошибка. В чем может быть дело? |
|
Сообщ.
#2
,
|
|
|
|
file.dbt это не файл "базы" а мемо поля
file.cdx это не dBase, а ФоксПро |
|
Сообщ.
#3
,
|
|
|
|
Цитата ReLock @ В чем может быть дело? В Цитата ReLock @ 'Index does not exist Как создаешь, как удаляешь? |
|
Сообщ.
#4
,
|
|
|
|
Цитата Anatoly Podgoretsky @ file.dbt это не файл "базы" а мемо поля file.cdx это не dBase, а ФоксПро file.dbt - это просто шаблон. Я могу написать "file.xxx". Это дела не меняет. У меня в структуре при создании БД указан тип: DBASEIV. Я специально поменял расширение, чтобы небыло привязки иконки к DBF. Хотелось сделать свою иконку. Так сказать: DBT - "Database Tournament". to BAS: Активация и индексация: ![]() ![]() cIndex:= ChangeFileExt(ExtractFileName(TourFName),'.cdx'); DataSet.Active := True; SetIndexTable(cIndex,'LNAME','LNAME + FNAME','Tables',DataSet, True); Процедура индексации: ![]() ![]() 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; Сам запрос: ![]() ![]() 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 дня назад все отлично работало при такой структуре. Вчера заметил такой ньюанс. Когда запускаю программу и создаю новую базу, то с ней все в порядке (можно даже выполнять к ней запросы). Но как только я добавляю в нее новые записи, либо я закрываю программу и подключаю базу снова - происходит вышеописанная ошибка. После ошибки база отключается. В структуре БД повреждений нет. Поключается свободно и все данные из нее в программе отображаются корректно. |
|
Сообщ.
#5
,
|
|
|
|
Вообщем разобрался с этой проблемой. Только есть некоторые непонятные вещи. Может кто-нибудь сможет объяснить эти явления? :?:
Короче дело вот в чем: Из полного имени файла конфигурации, который лежит в другом каталоге (имя файла конфигурации и имя БД идентичны, просто лежат в разных каталогах), вытаскивается только имя и меняется расширение на CDX: ![]() ![]() cIndex:= ChangeFileExt(ExtractFileName(TourFName),'.cdx'); База данных становится активной: ![]() ![]() DataSet.Active := True; База индексируется: ![]() ![]() SetIndexTable(cIndex,'LNAME','LNAME + FNAME','Tables',DataSet, True); После этих действий в каталоге с базой данных создается индекс для этой БД и в заголовке БД-файла выставляется признак, что "используется индекс". База индексируется. Но в этом случае при попытке выполнить к этой БД запрос - выходит вышеописанная ошибка. Если же сделать так: Формирую новое расширение (полный путь остается): ![]() ![]() cIndex:= ChangeFileExt(TourFName,'.cdx'); База данных становится активной: ![]() ![]() DataSet.Active := True; База индексируется: ![]() ![]() SetIndexTable(cIndex,'LNAME','LNAME + FNAME','Tables',DataSet, True); После этих действий в каталоге с файлом конфигурации создается индекс для БД и в заголовке БД-файла НЕ выставляется признак, что "используется индекс". База индексируется. И только В ЭТОМ случае к базе можно применить запрос. :?: :?: :?: |
|
Сообщ.
#6
,
|
|
|
|
Ура! Все разобрал. Короче дело вот в чем: - если у базы расширение <DBF>, то можно смело делать для нее индекс в том же каталоге. К заголовке файла выставится признак, что база инпользует индекс и к ней можно делать любые запросы. - если же у базы расширение, отличное от DBF (например, XXX), то при создании индекса для этой базы в том же каталоге (в заголовок файла опять же выставится признак, что база использует индекс) - к этой базе нельзя применить запрос (BDE ругается на заголовок базы и индекса, мол поврежден). Для этого случая единственным решением будет создать для базы индекс в другом каталоге (в заголовок файла не запишется, что база использует индексы, зато к ней можно применить любые запросы). Вот такая вот кухня. Добавлено Все! Тема закрыта. |