Bde и индексы

  • Автор темы SNike
  • Дата начала
S

SNike

#1
Не раз встречал инфу о том что в BDE часто возникают проблемы с индексами. Однажды и сам столкнулся с подобной проблемой.
Вопрос в том - как переиндексировать таблицу Paradox? Причем не имею ввиду удалить и создать индексы заново, а переиндексировать полностью, включая и индекс ключевого поля
 
S

SNike

#3
Если испоганились индексы - невозможно открыть таблицу. Единственный способ - её переиндексация. В моем случае пришлось воспользоваться прогой стороннего разработчика. Отсюда и вытекает - что лучше при старте программы переиндексировать таблицы. Как, собстно, и делается во многих программах. Только вот как это сделать?
 
P

PeterBuild

#4
Если испоганились индексы - невозможно открыть таблицу. Единственный способ - её переиндексация. В моем случае пришлось воспользоваться прогой стороннего разработчика. Отсюда и вытекает - что лучше при старте программы переиндексировать таблицы. Как, собстно, и делается во многих программах. Только вот как это сделать?
Если я правильно понимаю Вы хотите при запуске своей программы удалить существующие индексы и создать новые? Если да, то я бы сделал процедурку которая именно это и будет деать и повесил бы на ОнКреате ДатаМодуля или Формы, смотря что используете! В процедуре сначало надо удалить индексы DeleteIndex, а потом их снова создать AddIndex :~(-}) Смотри справку по єтим методам! Успехов!
 
S

SNike

#5
Эти методы неприменимы для первичного индекса.
Вот выдержка из хелпа:

Call DeleteIndex to remove a secondary index for a table. Name is the name of the index to delete. DeleteIndex cannot remove a primary index.

Note: To delete an index, an application must first open the table for exclusive access.



Как видишь, не может удалить первичный индекс. К томуже таблица должна быть открыта, а открыть её - не удается.

Обо всем этом я уже говорил в первом посте

Так что это проблемы не решит.
 
S

sdriver

#6
А, если сделать через буферную базу данных, в которую скопировать все данные из основной. Удалить основную, а потом создать каркас и заполнить данные из буферной.
 
S

SNike

#7
Это сделать неполучится. Объясняю ситуацию.
Перебой питания -> Ошибка в индексах -> Данные недоступны --->>> Неоткуда брать данные в буфер.
Да и как делать буфер если неизвестно какая из таблиц упадет и если там много записей. Тогда проще вести две базы синхронно :) .

Конечно, можно использовать TUtil от Borlad, но хотелось бы обойтись без дополнительных модулей в программе.
 
L
#8
От всей души советую отказаться от BDE пока не поздно. А оно никогда не поздно. Ибо BDE жутко глючная штука.
 
S

SNike

#9
В том то и дело что сейчас отказаться от этого не могу. Где-то около года еще придется поиспользовать. Потому и поднял эту тему
 
L
#10
Когда пробовал использовать BDE тоже столкнулся с разрушением индексов. Это было лет 5 назад под Билдером1. Переиндексации я тогде не нашёл. Восстанавливал их ручным удалением *.cdx и созданием индексов заново.
Примерно год назад под Билдером6 снова пробовал использовать BDE после разрушения индексов создавал копию БД, затем BathMove копироовал все данные в новую таблицу и создавал индексы.
Другого решения не нашёл. Сейчас использую Advantage Database Server 8. Доволен на 100%.

Забыл о разрушении индексов как о страшном сне.
 
S

SNike

#11
Для восстановления индексов Paradox можно использовать TUtil.dll (или TUtil32.dll, точно не помню) от Borland. Только хотелось бы обойтись без него...
 
L
#12
Да я тоже слышал об этой библиотеке, но не люблю когда в моей программе код что-то делает и я не знаю что :) Вариант с пересозданием базы мне показался более прозрачным. Тем более что под BDE нецелесообразно работать с базами более 100 000 записей, а значит пересоздание будет происходить за пару секунд.
 
B

Barmutik

#13
Для: LAW

Не надо так громко заявлять обо всём BDE... если у Вас конкретно что-то глючило .. это совесм не значит то и в общем не должно работать..

Я учавствовал в написании программ энтерпрайз уровня где всё общение с серверами БД было построено на BDE .. и всё чудесно работало ...
 
L
#14
Ну может я и не прав.
Но приведу конкретные факты выясненные мной. Использую Query и SQL без подзапросов.
Все инсерты и апдейты на Prepare. Сначала делаем апдейт, если не найдено инсерт.
В результате обработки на С++ расчитанные данные заносились в 4 таблицы
Исходная БД на 30 полей, одно поле 50 символов остальное мелоч. Куда пишутся результаты БД и того меньше.
Во первых обработка шла нелинейно в отличии от нормальных движков dbf.
100 000 записей рассчитывались очень быстро.
Обработка 500 000 заняла примерно столько времени как и на других движках.
1 000 000 в 4 раза медленнее, а на 2 000 000 просто завис.
Естественно расчёты делались в более менее равных условиях после перезагрузки.

При смене компонентов на сторонние (Advantage, Apollo, Halcyon) время было линейным и без зависаний и на 5 000 000. Так что BDE очень подозрителен. И вопрос с его использованием в свете вышеизложенного для меня решён.

Удачи.
 
S

SNike

#15
Для: LAW

Вариант пересоздания базы - не лучший. Вот проблема которая реально встретилась: не открыть таблицу Paradox, для нее повредился индекс, данные недоступны.

Как в этом случае может помочь пересоздание базы? Никак. Требуется НЕ ПОТЕРЯТЬ данные.

В моем случае помог Plug-In для Total Commander (для баз данных). С его помощью я сделал ReIndex и снова получил доступ к данным. Вот о таком способе я и веду речь, может кто знает как это реализовать?