Меню

Домашние финансы ошибка сохранения key violation

1 / 1 / 0

Регистрация: 25.12.2010

Сообщений: 25

1

27.12.2011, 17:46. Показов 21924. Ответов 4


Подскажите, пожалуйста, кто знает. В БД при добавлении записи появляется ошибка Key Violation. Не могу установить причину её появления, ну и соответственно исправить.Причём самое интересное то, что первоначально всё работало нормально, а потом появилась эта ошибка. Я восстанавливал базу из архивной копии — ошибка пропадала, но потом опять появлялась. Использую BDE, таблицы Paradox. Заранее спасибо

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



1 / 1 / 0

Регистрация: 25.12.2010

Сообщений: 25

27.12.2011, 22:05

 [ТС]

2

PS: Есть такое предположение.База работает в сети.Скорее всего ошибка возникла из-за того, что таблицы в BDE автоматически не обновляются.Т.е. запись добавленная в одну и ту же таблицу на разных компах,наверное,имеет один ID (ID — первичный индекс,автоинкремент).Самое интересное то, что у меня на одном компе такая ошибка тоже была…



0



1 / 1 / 7

Регистрация: 28.06.2011

Сообщений: 342

28.12.2011, 10:07

3

Key violation — нарушение ключа.. Ты в поле(я), входяще в ПК (первичный ключ) пытаешься ввести одиноковое(ые) значение(я)..Если поле типа AutoInc, то вполне реально могла порушиться таблица и генерируется одно и тоже значение.. Самы просто йвариант — создать аналогичную таблицу где-то еще и перетянуть туда данные.. Хотя тут может быть проблем, если ID где-то используется как мастре-ключ…



0



1 / 1 / 0

Регистрация: 25.12.2010

Сообщений: 25

28.12.2011, 12:17

 [ТС]

4

А из-за чего может рухнуть таблица? Дело в том, что БД работает далеко от меня и люди, которые с ней работают ничего с ней не смогут сделать.Не могу же я каждый раз выезжать к ним или брать у них эти таблицы, чтобы их исправить.



0



1 / 1 / 7

Регистрация: 28.06.2011

Сообщений: 342

28.12.2011, 13:22

5

А из-за чего самолеты падают ? В настройках BDE-Local Share=True — ОБЯЗАТЕЛЬНО ! А рухнуть… Лепистричество вырубилось, комп повис в момент записи (значение счетчика в заголовке таблицы где-то лежит).. Да мало ли что…



0



>
Key violation или детские грабли
, Paradox/BDE

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
22.11.05, 07:23

    Full Member

    ***

    Рейтинг (т): 11

    Привет всем! :)
    Delphi 7/Paradox/BDE
    Ситуация выглядит так: имеются несколько отдельных таблиц *.db В каждой из них имеется одно ключевое поле (типа autoincrement). И несколько обычных (целочисленные и строковые). Внешних ключей нет (соответственно таблицы между собой не связаны, каждая сама по себе). Работаю с таблицами через компоненту TQuery. Точнее у меня на каждую таблицу используется своя Query (так надо было: чтобы одновременно можно было наборы данных из разных таблиц в разных DBGrid смотреть, а через Query проще делать выборку по условиям). Запись новых строк делаю тоже через Query, но в следующей последовательности: создаю новый Query, выполняю insert для нужно таблицы, освобождаю Query. После, для связанного с таблицей Query делаю Close/Open.
    Кроме того, чтобы при запущенной проге никто извне не мог читать данные, стоят дополнительно компоненты Table с Exclusive=true.
    Эта программа стоит у достаточного количества пользователей. У некоторых из них через разное время перестали добавляться новые записи. Выдается ошибка «Key Violation». Читать данные можно, делать update тоже, а вот добавлять новые — нет. :wall: Дублирование записей исключено (у меня автоинкрементное поле стоит), переполнение тоже быть не может. :wall: Может кто знает из-за чего такая штука возможна? Заранее спасибо.

    —-
    ЗЫ: больней чем наступить на грабли, может быть только наступить на детские грабли! :wacko:


    Coala



    Сообщ.
    #2

    ,
    22.11.05, 08:16

      :wall: , но я бы не стал вводить для добавления рантаймовый TQuery. C BDE давно не работал, но там для запросов на изменение данных
      надо с каждым TQuery иметь TUpdateSQL с соответствующими настройками. Возможно, глючит здесь.

      Цитата SilverShield @ 22.11.05, 07:23

      стоят дополнительно компоненты Table с Exclusive=true

      не совсем понятно…
      ЗЫ. А нет возможности перейти на ADO?


      .DeV!L



      Сообщ.
      #3

      ,
      22.11.05, 08:19

        Full Member

        ***

        Рейтинг (т): 11

        Цитата SilverShield @ 22.11.05, 07:23

        Работаю с таблицами через компоненту TQuery. Точнее у меня на каждую таблицу используется своя Query (так надо было: чтобы одновременно можно было наборы данных из разных таблиц в разных DBGrid смотреть, а через Query проще делать выборку по условиям). Запись новых строк делаю тоже через Query, но в следующей последовательности: создаю новый Query, выполняю insert для нужно таблицы, освобождаю Query. После, для связанного с таблицей Query делаю Close/Open.
        Кроме того, чтобы при запущенной проге никто извне не мог читать данные, стоят дополнительно компоненты Table с Exclusive=true.

        :wacko: :wacko: :blink: афтар выпей йаду!!!!

        если ею пользуются много народу, то BDE отпдает автоматически, так как это не клиент серверная БД!!!

        тебе нада InterBase или что-то похожее….

        а твой проект это не детские грабли….это МЕГА ГРАБЛИ!!!! :ph34r:

        Сообщение отредактировано: .DeV!L — 22.11.05, 08:21


        SilverShield



        Сообщ.
        #4

        ,
        22.11.05, 08:29

          Full Member

          ***

          Рейтинг (т): 11

          Запись новых строк производится не в самой проге, а вынесена в dll, потому и производится динамически. Через ADO, на сколько я знаю, Парадокс извратно использовать.
          .DeV!L, все с тобой ясно. Действительно награмождение, но все-таки, есть мысли по делу? Хотяб в каком направлении копать?

          Добавлено 22.11.05, 08:35
          .DeV!L, это локальная база, с ней надо работать только одному пользователю, так что с архитектурой все нормально. А про мега-грабли, читай ЗЫ :)


          Coala



          Сообщ.
          #5

          ,
          22.11.05, 08:38

            Цитата SilverShield @ 22.11.05, 08:29

            Запись новых строк производится не в самой проге, а вынесена в dll, потому и производится динамически.

            А кто тебе мешает в длл-ке иметь квери и апдейт-скл, созданные в дизайне?


            SilverShield



            Сообщ.
            #6

            ,
            22.11.05, 09:03

              Full Member

              ***

              Рейтинг (т): 11

              Coala, согласен, можно и в дизайне. Попробую поставить TUpdateSQL, он вроде кэшировать запросы позволяет?


              Coala



              Сообщ.
              #7

              ,
              22.11.05, 09:12

                Цитата SilverShield @ 22.11.05, 08:29

                Через ADO, на сколько я знаю, Парадокс извратно использовать.

                Первый раз слышу :(

                Цитата SilverShield @ 22.11.05, 09:03

                Попробую поставить TUpdateSQL, он вроде кэшировать запросы позволяет?

                Деталей не помню, но без него ты просто не создашь запрос на модификацию данных (в отличие от ADO).


                SilverShield



                Сообщ.
                #8

                ,
                22.11.05, 09:19

                  Full Member

                  ***

                  Рейтинг (т): 11

                  Цитата Coala @ 22.11.05, 09:12

                  Деталей не помню, но без него ты просто не создашь запрос на модификацию данных (в отличие от ADO).

                  ExpandedWrap disabled

                    update Table1 set Col2 = … where Col1 = …

                  Все отлично работает и без TUpdateSQL :)

                  ExpandedWrap disabled

                    TUpdateSQL applies cached updates on behalf of queries or stored procedures that can’t post updates directly.

                  Взято из хелпа к нему.

                  Сообщение отредактировано: SilverShield — 22.11.05, 09:20

                  Wizard

                  Bas



                  Сообщ.
                  #9

                  ,
                  22.11.05, 09:58

                    А сколько записей в таблицах (чему равен максимальный id)?


                    SilverShield



                    Сообщ.
                    #10

                    ,
                    22.11.05, 10:08

                      Full Member

                      ***

                      Рейтинг (т): 11

                      Не больше 6000. Поэтому вариант с переполнением я и исключил.
                      Кстати, таким образом загнулось сразу несколько таблиц! Связей через ключи между этими таблицами нет. :wall: Главное причину понять, тогда я ее как-нить уже поборю.


                      H.Iglesias II



                      Сообщ.
                      #11

                      ,
                      22.11.05, 10:16

                        Цитата

                        Главное причину понять, тогда я ее как-нить уже поборю.

                        попробуй удалить и создать заново их индексы


                        Coala



                        Сообщ.
                        #12

                        ,
                        22.11.05, 10:21

                          Цитата SilverShield @ 22.11.05, 07:23

                          Выдается ошибка «Key Violation».

                          Полный текст сообщения можешь привести?


                          SilverShield



                          Сообщ.
                          #13

                          ,
                          22.11.05, 10:36

                            Full Member

                            ***

                            Рейтинг (т): 11

                            Сообщение ошибки выглядит примерно так:

                            ExpandedWrap disabled

                              «Project PTest1.exe raised exception class EDBEngineError with message ‘Key violation’. Process stopped. … «

                            Но это уже последствия, когда все запорчено и просто нельзя добавить новые записи.

                            Добавлено 22.11.05, 10:38
                            H.Iglesias II, подскажи если не трудно, через что пересоздание индексов делается? Мне это впервой, я обычно с MSSQL работаю :)

                            Wizard

                            Bas



                            Сообщ.
                            #14

                            ,
                            22.11.05, 10:41

                              Цитата SilverShield @ 22.11.05, 10:36

                              через что пересоздание индексов делается?

                              ExpandedWrap disabled

                                DROP INDEX table_reference.index_reference | PRIMARY

                                CREATE [UNIQUE] [ASC | DESC] INDEX index_reference ON table_reference (column_reference [,column_reference…])


                              SilverShield



                              Сообщ.
                              #15

                              ,
                              22.11.05, 11:17

                                Full Member

                                ***

                                Рейтинг (т): 11

                                Спасибо. Только дело в том что я из индексов использовал только первичный ключ (поставил на автоинкрементное поле). В хелпе Database Desktop нашел такую фразу: первичный индекс в Paradox может быть создан только через определение первичного ключа при создании таблицы. Получается единственное решение — это грохать таблицу и создавать ее заново?
                                Если проблема в падении индексов, то все равно не понятно почему они упали сразу на нескольких таблицах с разной структурой и разным количеством строк!

                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                0 пользователей:

                                • Предыдущая тема
                                • Delphi: Базы данных
                                • Следующая тема

                                [ Script execution time: 0,0842 ]   [ 16 queries used ]   [ Generated: 29.01.23, 07:00 GMT ]  

                                 
                                KIR
                                 
                                (2002-07-25 13:48)
                                [0]

                                Народ, что такое сабж и как от него избавляться, а то у меня периодически такое случается. И после этого невозможно вносить записи в таблицу. Слава богу, что я базу каждый день копирую, но все же…


                                 
                                kaif
                                 
                                (2002-07-25 13:52)
                                [1]

                                А можно подробнее? Как выражается то, что

                                >после этого невозможно вносить записи в таблицу


                                 
                                Anatoly Podgoretsky
                                 
                                (2002-07-25 13:53)
                                [2]

                                Поле уникальное ли какие другие ограничения


                                 
                                KIR
                                 
                                (2002-07-25 14:01)
                                [3]

                                Все происходит следующим образом: приложение работает совершенно нормально, т.е. вносит-изменяет-удаляет записи в таблицах БД. Потом без всяких видимых причин при добавлении очередной (кстати 601 по счету) записи выдается сообщение «Key Violation». И все…


                                 
                                kaif
                                 
                                (2002-07-25 14:03)
                                [4]

                                Дело в том, что в BDE есть ошибка.

                                1.Если нарушить уникальность.

                                2.Затем сделать SQL-запрс.

                                3.Затем еще раз нарушить уникальность.

                                То у Paradox таблицы разрушается индекс (index out of date).

                                Эта ошибка есть в D3,D4,D5,D6.

                                Я поэтому с Paradox не работаю.


                                 
                                kaif
                                 
                                (2002-07-25 14:06)
                                [5]

                                В принципе, после key violation ничего особого происходить не должно.

                                Что значит «и все» ?

                                Программа виснет, база потом не откывается (если да, то что при этом сообщается) и т.д…?

                                Ну нельзя так абстрактно вопросы задавать!


                                 
                                Lord Warlock
                                 
                                (2002-07-25 14:07)
                                [6]



                                > kaif © (25.07.02 14:03)

                                Надо не нарушать уникальность



                                > KIR © (25.07.02 14:01)

                                Переиндексируй таблицу


                                 
                                kaif
                                 
                                (2002-07-25 14:23)
                                [7]

                                >Lord Warlock © (25.07.02 14:07)

                                >> kaif © (25.07.02 14:03)

                                >Надо не нарушать уникальность

                                Как это???


                                 
                                Lord Warlock
                                 
                                (2002-07-25 14:29)
                                [8]



                                > kaif © (25.07.02 14:23)

                                Программа не должна нарушать уникальность и целостность БД. Ошибки могут возникать если например отрубили свет. В таком случае надо автоматом запускать переиндексацию, тогда всем будет хорошо.


                                 
                                Lusha
                                 
                                (2002-07-25 14:34)
                                [9]

                                >Lord Warlock © (25.07.02 14:29)

                                Не всегда… Иногда не успевает прописаться новое значение автоинкрементного ключа в заголовок таблицы… Тогда даже при рабочих индексах имеем Key violation при добавлении записи…


                                 
                                Anatoly Podgoretsky
                                 
                                (2002-07-25 14:42)
                                [10]

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

                                Парадокс на то Парадокс.

                                Главный парадокс что он как то еще и работает иногда.

                                Здесь очень абстрактный вопрос, у меня что то не работает и полное нежелание привести подробности, поля, индекксы, сетевая или локальная база, поддается ли ремонту и т.д.

                                Ну нельзя так абстрактно вопросы задавать!


                                 
                                kaif
                                 
                                (2002-07-25 15:02)
                                [11]

                                > Lord Warlock © (25.07.02 14:29)

                                > kaif © (25.07.02 14:23)

                                > Программа не должна нарушать уникальность и целостность БД

                                Ключи на то исуществуют, чтобы не нарушать целостность. Key Violation — сообщение о попытке такого нарушения. Что-то я в толк не возьму, что Вы имеете в виду. Чтобы я сказал юзеру «Не нарушай уникальность, а то key violation будет»? Paradox защищает целостность с помощью этой исключительной ситуации. А то, что 2 попытки нарушить key и запрос между ними разрушают базу — это баг, который логически обойти невозможно в принципе, не отказавшись от использования Local SQL в Paradox.


                                 
                                Lord Warlock
                                 
                                (2002-07-25 15:06)
                                [12]



                                > Lusha © (25.07.02 14:34)

                                Надо делать свой механизм автоинкрементного ключа



                                > kaif © (25.07.02 15:02)

                                повторяю еще раз, программа должна быть написана так, чтобы пользователь не смог нарушить уникальность ключа. Пользователь вообще не знает ничего про этот ключ, поэтому ему наплевать что там нарушилось. Необходимо предусмотреть «защиту от дурака».


                                 
                                kaif
                                 
                                (2002-07-25 15:21)
                                [13]

                                >2 Lord Warlock © (25.07.02 15:06)

                                А я и не говорю про автоинкремент.

                                По-вашему, в Paradox таблице вообще не нужны никакие уникальные индексы? Пускай все приложение делает? А если много юзеров, а если уникальность, это номер, например, введенного счета-фактуры?

                                И вообще я работаю с клиент-серверными базами. Там нарушение ключа — всегда дело сервера, а не приложения. Иначе вообще не нужны были бы все эти индексы…

                                Боюсь, что Вы зря настаиваете на своем подходе. Я говорил о баге, который есть в BDE и который в упор никто не хочит исправить. А в результате только и слышишь: «Парадокс — ненадежная база». А баг очень простой и мало заметный. И его нужно исправить, а не обходить. Без него Paradox — прекрасная СУБД.


                                 
                                KIR
                                 
                                (2002-07-26 11:21)
                                [14]

                                Народ, извините, что не дал все подробности, о которых вы просите. Я просто не ожидал такой бурной дискусси на данную тему. Но, честно говоря разъяснять-то особо и нечего. BDE выдает сообщение «Key Violation» и отказывается добавлять запись в таблицу. Вот принципе и все. Вот еще, кстати, при использовании DataBase DeskTop»a после данной ситуации как-то странно себя вело значение в автоинкрементном поле, т.е. обычно, когда вы добавляете запись (просто нажимаете стрелку «вниз» находясь на последней строчке таблицы в DataBase DeskTop»e), то в автоикрементном поле очередной записи сразу добавляется очередное значение — в моем случае такого не случалось.

                                И второй вопрос: я не очень давно занимаюсь БД, поэтому не понимаю выражения «переиндексировать таблицу». Как это делается.


                                 
                                kaif
                                 
                                (2002-07-26 12:06)
                                [15]

                                Переиндексировать — это удалить имеющийся индексный файл и вместо него создать новый.

                                Индексный файл это, грубо говоря, упорядоченный список ссылок на номера записей, причем список, упорядоченный по значениям какой-то группы полей. Индексный файл позволяет СУБД путем деления диапазонов пополам быстро находить запись по значению в ключевом поле, например, в таблице в миллион записей можно найти любую запись за 20 шагов.

                                Для переиндексации компонент TTable имеет свойство IndexDefs, имеющее соответствующие методы. Почитай Help. Там, кажется, были примеры того, как создать индекс заново.


                                 
                                Weare
                                 
                                (2002-07-26 12:07)
                                [16]

                                Например, в твоем же desktop»e открыть таблицу и поставить внизу галочку Pack Table, или просто пересоздать индексы.А можно и програмно:

                                Table.Exclusive:=True;

                                Table.Open;

                                Check(dbiRegenIndexes(Table.Handle));


                                 
                                KIR
                                 
                                (2002-07-26 12:41)
                                [17]

                                Еще вопрос — у меня в БД достаточно много перексрестных ссылок (насколько я понимаю, это то же самое что и внешний ключ). Так вот из-за этого к некоторым таблицам невозможно добавлять поля. Paradox пишет, что «detail table exists». В DBDeskTop»e убираю все Referential Integrity — пишет то же самое. В итоге я вообще отказался от применения внешних ключей в БД. Т.е. не совсем отказался. Я просто не устанавливаю связи через Referential Integrity в DBDeskTop»e. Правильно я делаю?


                                 
                                Mike Kouzmine
                                 
                                (2002-07-26 12:43)
                                [18]

                                Конечно правильно.


                                darkdevill

                                Сообщения: 2
                                Зарегистрирован: 14 сен 2010, 12:28

                                Администратор результатов выдает ошибку key violation

                                При запуске Администратора результатов, выдается ошибка key violation, и отображается только часть результатов. результаты хранятся на сетевом ресурсе, одна папка для всех пользователей. В чём проблема?


                                Аватара пользователя

                                Keepsoft

                                Администратор
                                Сообщения: 3648
                                Зарегистрирован: 20 мар 2008, 18:03
                                Контактная информация:

                                Re: Администратор результатов выдает ошибку key violation

                                Сообщение Keepsoft » 01 июн 2011, 13:21

                                darkdevill писал(а):При запуске Администратора результатов, выдается ошибка key violation, и отображается только часть результатов. результаты хранятся на сетевом ресурсе, одна папка для всех пользователей. В чём проблема?

                                Переиндексируйте базу данных. Для этого один раз запустите файл ReIndexBase.bat из папки Конструктора тестов.
                                Если не поможет, то обратитесь пожалуйста в службу тех. поддержки по e-mail:

                                support@keepsoft.ru



                                Вернуться в «Общие вопросы»

                                Кто сейчас на конференции

                                Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость

                                Обсуждение программы Домашние финансы


                                 
                                вопрос

                                11.05.2006

                                Помогите, пожалуйста, получить груговую диаграмму.
                                при заказе вкладки «Диаграмма» выскакивают какие-то безумные четырехугольники. Хочется увидеть груговую диаграмму с суммой денег и % -ым эквивалентом.
                                Заранее спасибо.

                                 
                                  Запуск программы

                                27.04.2006

                                При очередном запуске программы выдается сообщение «BLOB has been modified» и все, программа не запускается. Кто знает, что это?

                                 
                                  личные финансы

                                18.03.2006

                                Присоединяюсь к вопросу: Где взять инструкцию?
                                Конкретная ситуация: в процессе работы с экрана из поля видимости исчезает часть записей, но остаток по счету считается верно. При перезапуске программы они вновь появлюятся на экране.

                                   
                                  Re: личные финансы

                                20.03.2006

                                А что на сайт разработчика трудно сходить? Там есть справка и форум по проге

                                 
                                  Новая версия 1.09 free

                                21.01.2006

                                вышла новая версия, (исправлены ГЛЮКИ, (периодически надо было чистить txt файл. теперь исправили

                                www.lab-1m.ru/download/home104.exe 2947кб

                                 
                                  Как запустить отладку?

                                разместил: IRA

                                29.07.2005

                                При открытие программы начала вылезать ошибка — где найти отладку и как ее запустить?

                                Есть мнение, пожелание или комментарий?

                                0 0 голоса
                                Рейтинг статьи
                                Подписаться
                                Уведомить о
                                guest

                                0 комментариев
                                Старые
                                Новые Популярные
                                Межтекстовые Отзывы
                                Посмотреть все комментарии

                                А вот еще интересные материалы:

                              • Яшка сломя голову остановился исправьте ошибки
                              • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
                              • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
                              • Домавтоматика dm320 ошибка шнека
                              • Дома меня ждал неожиданный сюрприз лексическая ошибка