Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Глючный BDE


Автор: p0s0l 12.7.2003, 20:00
table1.Filter := {тут выражение};
table1.Filtered := true;
table1.First;
while not table1.EOF do table1.Next;

Вот такая процедурина виснет. А виснет потому что после того как указатель попрыгает последовательно где-то по 10-20 записям возвращается в начало таблицы.
Table1 - Paradox, с активным вторичным индексом по обычному Integer-полю.
Если индекс отключить, то все ОК, но мне индекс нужен.
Как быть ?

И еще:
table2.Append;
// Занесение данных
table2.Post

Это выдаёт ошибку "Key violation", хотя в table2 Primary Index - поле AutoInc.
Как же тогда может выскочить Key violation ?

Причем эти глюки возникают крайне редко, но возникают, база - около 20000 записей.

Ну второй случай я привел так просто, он решается путем ручного увеличения поля.
А первый я не знаю как обойти.

Может кто-нибудь знает как обойти первый глюк и из-за чего вообще они возникают ?

Автор: Vit 13.7.2003, 01:36
Использовать Query и SQL проблемы исчезнут, и первая и вторая. А также после post попробовать ставить метод FlushBuffers

Автор: p0s0l 13.7.2003, 17:26
Дак SQL - это тормознее раза в 2-3 получается, у меня SQL запрос получился секунд 10...
А это не приемлимо.

А FlushBuffers - у меня таблица регулярно открывается и закрывается, так что этого не надо.

Автор: Vit 14.7.2003, 23:10
Цитата(p0s0l @ 13.7.2003, 08:26)
Дак SQL - это тормознее раза в 2-3 получается, у меня SQL запрос получился секунд 10...
А это не приемлимо.

Это слишком долго, скорее всего нужные индексы отсутствуют, т.к. запрос должен проходить не медленнее, чем досупом через таблицу...

Автор: Medved 15.7.2003, 06:05
Цитата(Vit @ 15.7.2003, 02:10)
Это слишком долго, скорее всего нужные индексы отсутствуют, т.к. запрос должен проходить не медленнее, чем досупом через таблицу...

это Вит актуально только для клиент-серверной модели БД. С локальными БД "доступ через таблицу" будет работать гораздо шустрее.

Автор: Akella 15.7.2003, 08:18
Цитата
И еще:
table2.Append;
// Занесение данных
table2.Post
Это выдаёт ошибку "Key violation", хотя в table2 Primary Index - поле AutoInc.
Как же тогда может выскочить Key violation ?


У меня тоже вылетала такая ошибка. Я обнаружил, что у меня вызывается метод POST два раза подряд.
Посмотри, может у тебя после добавления записи происходит переход на другую, а при этом метод POST вызывается автоматически.

Автор: p0s0l 15.7.2003, 15:04
Нет, там все в порядке. Программа работает идеально где-то неделю, а потом - раз и вылезает глюк. Хотя до появления глюка эта часть программы работала нормально, и эта процедурина используется довольно часто. Но индекс отключишь - и глюка как не бывало, может работать сколько угодно. В ручную же пересортировывать всю таблицу - это больше часа получается, поэтому без индекса нельзя.

Автор: Medved 15.7.2003, 15:10
Цитата
Нет, там все в порядке. Программа работает идеально где-то неделю, а потом - раз и вылезает глюк. Хотя до появления глюка эта часть программы работала нормально,


2p0s0l, что-то вообще непонятное.... Чую нутром где-то сам недосмотрел....

Автор: p0s0l 15.7.2003, 15:33
2Pegas, говорю ведь, деалю table1.next - и глючит, где я тут ошибся ? table1 с маленькой буквы написал ?

Автор: Medved 16.7.2003, 12:07
Цитата(p0s0l @ 15.7.2003, 18:33)
2Pegas, говорю ведь, деалю table1.next - и глючит, где я тут ошибся ? table1 с маленькой буквы написал ?

Запости исходник.
А еще лучше на мыло пришли.

Автор: p0s0l 16.7.2003, 17:40
2Pegas:
Смотри: работает прога нормально некоторое время, потом вылазит глюк (предположим что даже
по моей вине). Беру там же на месте пишу НОВУЮ прогу, которая только и делает что:
table1.Open;
table1.IndexName := 'ix1';
table1.Filter := '...'; table1.Filtered := true;
while not table1.eof do table1.next

Прога виснет и как я уже писал из-за того что, например,
после записи №10 идет №15, №500, №1246, потом снова №10, №15, №500, №1246, №10 и т.д. вечно

Т.е. сама таблица каким-то образом стала глючной, я вот про че говорю.

Я не знаю, что нужно написать, чтобы добиться этого глюка ? Что я делал с таблицами, дак
это все стандартные методы типа open, append и т.д.

Ты хочешь одним взглядом на исходник (~7000 строк) определить правильность моей программы ?
Если хочешь, то я тебе его вышлю, но это тебе ничего не даст, т.к. глюк вылазит где-то после
недели использования программы, а ты будешь этим заниматься ? Я пытался у себя
дома заставить появиться этот глюк - но нет, не появляется. А там где стоит эта программа,
где её и юзают - там-то он и вылазит как назло.

Вооще у меня давно уже такое желание - плюнуть на тэтэйблы и написать все это дело вручную.
Будет спокойнее и намного (как я думаю) быстрее.
Тогда уж если глюк и будет - то моей вине, а щас я уверен на 99% - что с BDE не все ОК.
Как я думаю, если я что-то не так делаю с таблицей, BDE не должен мне давать делать этого,
а ведь дает (если все-таки я деляю чо-то неправильное), или же сам мне подгавнивает потихонечку...


Автор: Medved 16.7.2003, 20:46
Прошу только не обижаться, но на 99% уверен, что проблема как раз-то не в BDE. (не потому что BDE безгрешный, просто у меня на счет этой проблеммы есть свои предположения)

Мне не надо высылать весь исходник, а вышли:

Цитата

Беру там же на месте пишу НОВУЮ прогу, которая только и делает что:
table1.Open;
table1.IndexName := 'ix1';
table1.Filter := '...'; table1.Filtered := true;
while not table1.eof do table1.next

Прога виснет и как я уже писал из-за того что, например,
после записи №10 идет №15, №500, №1246, потом снова №10, №15, №500, №1246, №10 и т.д. вечно

Т.е. сама таблица каким-то образом стала глючной, я вот про че говорю.


Т.е. эту маленькую программку, и саму таблицу. Я уверен, что найду ошибку.


Автор: p0s0l 16.7.2003, 23:10
2Pegas: Только подожди недельку, а то мне надо закачать себе то эту таблицу (я вожусь прямо там на месте, на дискете её не притащить).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)