| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > Key violations error ???? |
| Автор: Serg1234 12.10.2006, 08:53 |
| Привет всем. Есть таблица Paradox с главным индексом по автоинкрементальному полю и вторичными индексами. Пол года база работала нормально, а теперь пытаюсь вставить новую запись в таблицу и получаю ошибку Key violations error....? Это испортилась база и ошибка в коде программы??? Что делать как лечить??? Подскажите пожалуйста. |
| Автор: php 12.10.2006, 09:05 |
| Как пытаешься вставить новую строку ? |
| Автор: Serg1234 12.10.2006, 12:19 | ||
ошибка вылазит на строке Table1.Post |
| Автор: php 13.10.2006, 13:13 | ||||
Поробуй
и тоже самое для:
|
| Автор: samurai 16.10.2006, 09:26 |
| ошибки из личного опыта: 1. key violation вылазил, тогда когда пытался редактировать запись с автоинкрементальным ключом, возможно для добавления новой нужно использовать не Insert а Append, он подберет следующее значение автоинкремента. 2. если таблицы связанные, то следить за порядком заполнения таблиц и вместо Table1.post использовать Table1.CachedUpdates:=true; это позволит вносить изменение привыходе из программы и при закрытии формы 3. у меня было много ошибок с автоинкрементом и я от него избавился, BDE капризная штука 4. Если раньше работало и вдруг перестало - значит сломались индексы, т.е. нужно их удалить и заново создать - можно в ручную - DataBase Desktop, можно прямо во время ошибки программно, при условии отсутствия blob полей, их желательно в отдельную таблицу |
| Автор: Akella 19.10.2006, 16:52 |
| скорее всего, что Primary индекс улетел в тёплые края |
| Автор: Serg1234 20.10.2006, 12:28 |
| Спасибо всем кто откликнулся. Судя по всему проблемы возникли с автоинкрементальным полем. Я в DataBase Desktop переопределил автоинкрементальное поле(поле по которому создан Primary индекс) как integer и сохранил базу. Потом это поле опять сделал автоинкрементальным, что позволило создать индексы заново. samurai, а как это сделать программно? |
| Автор: Aleksej 21.10.2006, 18:17 |
| для этого есть fieldDefs, а потом create table. или через Query. так же можно использовать функции с модуля BDE. кстати, на table1.append(); тоже ругается? |
| Автор: Serg1234 22.10.2006, 13:00 | ||
| На table1.append тоже ругалась, пока я не создал индексы заново. Теперь вопрос как программно создать индексы по автоинкрементальному полю. Я создал новую таблицу в которой автоинкрементальное поле(IncremField) представил как Integer, перенес данные из старой таблицы
Осталось поменять тип поля на autoincremen и создать индекс по этому полю. Но не получается P.s. Если кто увидел ошибки в коде - напишите пожалуйста. Заранее благодарен. |
| Автор: Akella 23.10.2006, 15:49 | ||
|
| Автор: Serg1234 23.10.2006, 19:21 |
На этапе создания таблицы я не могу полю присвоить тип Autoincrement, потому, что номера Autoincrement поля в новой таблице не будут совпадать с номерами в старой таблице, а по этому номеру связаны таблицы. На этапе копирования из старой таблицы приходится создавать поле типа Integer и копировать в него значение поля из старой таблицы. А вот после этого необходимо изменить тип поля на Autoincrement - и с этим основная проблема. |
| Автор: Akella 24.10.2006, 10:04 | ||
|
| Автор: Serg1234 24.10.2006, 23:39 |
Я так пробовал, ничего не происходит. Может после этой строки надо что то обновить? На форуме нашел пример использования функции DbiDoRestructure С её помощью получается изменить тип поля(например с Integer в Float, или Int16 to Int32), но сделать поле Autoincr.. - не получается. |
| Автор: Serg1234 26.10.2006, 09:05 |
Спасибо за совет, но что то я сомневаюсь, что это поможет решить проблему. В примерах показаны разные способы создания таблицы, а с этим проблем и у TTable нет. Есть проблема смены типа поля с Integer на Autoinc.(Но ведь в DataBase это работает Поиск Alter Table вывел на такой же вопрос - к сожелению он тоже остался без ответа. |
| Автор: Akella 26.10.2006, 10:03 | ||||||
Попробуй такую конструкцию
Alter Table и Create Table немного схожи в определении полей Добавлено @ 10:13
поиск на форуме по ключевому слову Alter Table http://forum.vingrad.ru/topic-47970/unread-1/hl/alter%2Cand%2Ctable/index.html Добавлено @ 10:14
|
| Автор: Serg1234 26.10.2006, 23:52 | ||||
Я этот вопрос и имел в виду. Но это уже не важно. Я нашел в чем проблема - проблема в том, что прежде чем изменять тип поля с Integer на Autoinc, необходимо по этому полю сделать Primary индекс. И все заработало (с помощью BDE!). В низу текст процедуры, может кому еще пригодится. p.s. Akella - спасибо за участие
|
| Автор: Akella 27.10.2006, 08:56 |
| Serg1234, пометь тогда как решённый |
| Автор: Serg1234 27.10.2006, 09:54 |
| Вопрос решен |