![]() |
|
|
![]()
|
|
| Serg1234 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Привет всем.
Есть таблица Paradox с главным индексом по автоинкрементальному полю и вторичными индексами. Пол года база работала нормально, а теперь пытаюсь вставить новую запись в таблицу и получаю ошибку Key violations error....? Это испортилась база и ошибка в коде программы??? Что делать как лечить??? Подскажите пожалуйста. |
|||
|
||||
| php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: нет Всего: 3 |
Как пытаешься вставить новую строку ?
--------------------
Джедаи не пройдут.. |
|||
|
||||
| Serg1234 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
ошибка вылазит на строке Table1.Post |
|||
|
||||
| php |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: нет Всего: 3 |
Поробуй
и тоже самое для:
--------------------
Джедаи не пройдут.. |
||||
|
|||||
| samurai |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 26.1.2006 Где: РФ, Омск Репутация: нет Всего: нет |
ошибки из личного опыта:
1. key violation вылазил, тогда когда пытался редактировать запись с автоинкрементальным ключом, возможно для добавления новой нужно использовать не Insert а Append, он подберет следующее значение автоинкремента. 2. если таблицы связанные, то следить за порядком заполнения таблиц и вместо Table1.post использовать Table1.CachedUpdates:=true; это позволит вносить изменение привыходе из программы и при закрытии формы 3. у меня было много ошибок с автоинкрементом и я от него избавился, BDE капризная штука 4. Если раньше работало и вдруг перестало - значит сломались индексы, т.е. нужно их удалить и заново создать - можно в ручную - DataBase Desktop, можно прямо во время ошибки программно, при условии отсутствия blob полей, их желательно в отдельную таблицу Это сообщение отредактировал(а) samurai - 16.10.2006, 09:33 |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
скорее всего, что Primary индекс улетел в тёплые края
|
|||
|
||||
| Serg1234 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Спасибо всем кто откликнулся.
Судя по всему проблемы возникли с автоинкрементальным полем. Я в DataBase Desktop переопределил автоинкрементальное поле(поле по которому создан Primary индекс) как integer и сохранил базу. Потом это поле опять сделал автоинкрементальным, что позволило создать индексы заново. samurai, а как это сделать программно? |
|||
|
||||
| Aleksej |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 5.10.2006 Где: Киев Репутация: нет Всего: нет |
для этого есть fieldDefs, а потом create table. или через Query. так же можно использовать функции с модуля BDE.
кстати, на table1.append(); тоже ругается? |
|||
|
||||
| Serg1234 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
На table1.append тоже ругалась, пока я не создал индексы заново.
Теперь вопрос как программно создать индексы по автоинкрементальному полю. Я создал новую таблицу в которой автоинкрементальное поле(IncremField) представил как Integer, перенес данные из старой таблицы
Осталось поменять тип поля на autoincremen и создать индекс по этому полю. Но не получается P.s. Если кто увидел ошибки в коде - напишите пожалуйста. Заранее благодарен. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
|
|||
|
||||
| Serg1234 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
На этапе создания таблицы я не могу полю присвоить тип Autoincrement, потому, что номера Autoincrement поля в новой таблице не будут совпадать с номерами в старой таблице, а по этому номеру связаны таблицы. На этапе копирования из старой таблицы приходится создавать поле типа Integer и копировать в него значение поля из старой таблицы. А вот после этого необходимо изменить тип поля на Autoincrement - и с этим основная проблема. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
|
|||
|
||||
| Serg1234 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Я так пробовал, ничего не происходит. Может после этой строки надо что то обновить? На форуме нашел пример использования функции DbiDoRestructure С её помощью получается изменить тип поля(например с Integer в Float, или Int16 to Int32), но сделать поле Autoincr.. - не получается. |
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
чесно признАюсь - не знаю как. Добавлено @ 09:13 не сталкивался с реструктуризацией Paradox таблицы программно. Добавлено @ 09:16 поищи в справке или в рунете по ключевому слову "DataType", мож пример найдёшь. Добавлено @ 09:20 Лично я советую тебе воспользоваться TQuery
Прочитал??? А теперь поищи и прочитай про "Alter Table" - реструктуризация таблицы. |
||||
|
|||||
| Serg1234 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Спасибо за совет, но что то я сомневаюсь, что это поможет решить проблему. В примерах показаны разные способы создания таблицы, а с этим проблем и у TTable нет. Есть проблема смены типа поля с Integer на Autoinc.(Но ведь в DataBase это работает Поиск Alter Table вывел на такой же вопрос - к сожелению он тоже остался без ответа. |
|||
|
||||
| Akella |
|
||||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Попробуй такую конструкцию
Alter Table и Create Table немного схожи в определении полей Добавлено @ 10:13
поиск на форуме по ключевому слову Alter Table http://forum.vingrad.ru/topic-47970/unread...able/index.html Добавлено @ 10:14
Это сообщение отредактировал(а) Akella - 26.10.2006, 10:03 |
||||||
|
|||||||
| Serg1234 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Я этот вопрос и имел в виду. Но это уже не важно. Я нашел в чем проблема - проблема в том, что прежде чем изменять тип поля с Integer на Autoinc, необходимо по этому полю сделать Primary индекс. И все заработало (с помощью BDE!). В низу текст процедуры, может кому еще пригодится. p.s. Akella - спасибо за участие
|
||||
|
|||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Serg1234, пометь тогда как решённый
|
|||
|
||||
| Serg1234 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Вопрос решен
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |