Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление индексов [dBase, FoxPro]


SimKa ©   (2005-08-23 10:17:00) 

Доброго времени суток, Уважаемые мастера ...
Есть вопрос:
При открытии базы данных (.dbf) Delphi ругается на утерянные индексный файл (.cdx).

Как сделать проверку на существование индексов и удалить все, если необходимо ...

Вообщем простой вопрос, но для студента очень нужно ...


SimKa   (2005-08-23 15:33:00) [1]

Нашел несколько документов на этот счет;
По-человечески ...
(DBF, BDE) Как открыть индексированную таблицу ...отсутствует файл индекса?
http://www.akzhan.midi.ru/devcorner/akdbtnt-content/Akzhan%27s-Database-Delphi-related-Tips%27n%27Tricks-rus.html
Спасибо всем ...


Rule   (2005-08-23 15:15:00) [2]

sniknik ©   (23.08.05 12:46) [3]
путь хороший, надо его исопльзоват с умом вот и все ...


Rule   (2005-08-23 15:15:00) [3]

max1000   (23.08.05 13:38) [5]
ну ты перегнул прям ...


sniknik   (2005-08-23 14:23:00) [4]

> max1000   (23.08.05 13:38) [5]
ну вот еще один... этому мало один файл ненароком испортить, ему массовость подавай, запустил случайно и все dbf-ы (от оракла к примеру) в текущей директории "полегли". а настоящие с непотеряным индексом "вдруг" перестали его использовать. такой вот симпатичный троянчик получился. ;о))


max1000   (2005-08-23 13:38:00) [5]

program Dbf_Strip;
{$APPTYPE CONSOLE}
uses SysUtils;

var f:   file;
   fs:  TSearchRec;
   buf: array [0..31] of byte;

begin
if FindFirst('*.dbf',faAnyFile,fs)<>0 then exit;
repeat AssignFile(f,fs.Name); Reset(f,1); BlockRead(f,buf,32);
 buf[28]:=0; Seek(f,0); BlockWrite(f,buf,32); CloseFile(f)
until FindNext(fs)<>0;
FindClose(fs)
end.


Anatoly Podgoretsky   (2005-08-23 13:09:00) [6]

sniknik ©   (23.08.05 10:41) [1]
Есть и это штатный путь, надо использовать dbiRegisterCallback
Он же вызывается и в Database Desktop, но его можно сделать и не видиммым, возможности там широкие.


sniknik   (2005-08-23 12:46:00) [7]

Rule ©   (23.08.05 12:35) [2]
хакерский путь нехороший путь. можеш запросто испортить файл вообще не относщийся к фоксу, просто имеющий такое расширение, а ты пытаясь открыть решил (по ексепту) что индекса нет... версия не подходит. и т.д. ты же проверяеш тип таблицы до "снятия" признака...
да и мало еще чего, ситуаций где может "глюкануть" много.


Rule   (2005-08-23 12:35:00) [8]

Вот эта вот процедурка удаляет признак того что есть индексы и удаляет признак кодировки ... какой из байтов за что отвечает не помню, поищи инфы по этому поводу много

procedure FixTable(TableName:String);
var
 FromF: File Of Byte;
 b: byte;
begin
 b:=0;
 AssignFile(FromF, TableName);
 Reset(FromF);
 Seek(FromF,29);
 Write(FromF,b);
 Seek(FromF,28);
 Write(FromF,b);
 CloseFile(FromF);
end;


sniknik   (2005-08-23 10:41:00) [9]

простой ответ. открой таблицу с подключением к драйверу фокса (VFP), он сам разберется и снимет признак если индексный файл удален.

есть еще и сложный ответ (с BDE), там автоматизации нет, надо все самому сниматть с использованием чегото там (функций BDE, реструктуризации вроде. не помню. да и не знал хорошо. а смотреть лень)

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо