![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление индексов [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, реструктуризации вроде. не помню. да и не знал хорошо. а смотреть лень)
и "хакерский" - снять признак непосредственно в файле, обнулить байт в заголовке (номер не скажу ибо не рекомендую этот путь, хочеш сам найдеш в описании структуры заголовка таблици фокса)