На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Key violation или детские грабли , Paradox/BDE
    Привет всем! :)
    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:
      :wall: , но я бы не стал вводить для добавления рантаймовый TQuery. C BDE давно не работал, но там для запросов на изменение данных
      надо с каждым TQuery иметь TUpdateSQL с соответствующими настройками. Возможно, глючит здесь.
      Цитата SilverShield @
      стоят дополнительно компоненты Table с Exclusive=true

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


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

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

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

        а твой проект это не детские грабли....это МЕГА ГРАБЛИ!!!! :ph34r:
        Сообщение отредактировано: .DeV!L -
          Запись новых строк производится не в самой проге, а вынесена в dll, потому и производится динамически. Через ADO, на сколько я знаю, Парадокс извратно использовать.
          .DeV!L, все с тобой ясно. Действительно награмождение, но все-таки, есть мысли по делу? Хотяб в каком направлении копать?

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

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

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

                Деталей не помню, но без него ты просто не создашь запрос на модификацию данных (в отличие от ADO).
                  Цитата Coala @
                  Деталей не помню, но без него ты просто не создашь запрос на модификацию данных (в отличие от 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 -
                    А сколько записей в таблицах (чему равен максимальный id)?
                      Не больше 6000. Поэтому вариант с переполнением я и исключил.
                      Кстати, таким образом загнулось сразу несколько таблиц! Связей через ключи между этими таблицами нет. :wall: Главное причину понять, тогда я ее как-нить уже поборю.
                        Цитата
                        Главное причину понять, тогда я ее как-нить уже поборю.

                        попробуй удалить и создать заново их индексы
                          Цитата SilverShield @
                          Выдается ошибка "Key Violation".

                          Полный текст сообщения можешь привести?
                            Сообщение ошибки выглядит примерно так:
                            ExpandedWrap disabled
                              "Project PTest1.exe raised exception class EDBEngineError with message 'Key violation'. Process stopped. ... "

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

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

                              ExpandedWrap disabled
                                DROP INDEX table_reference.index_reference | PRIMARY
                                 
                                CREATE [UNIQUE] [ASC | DESC] INDEX index_reference ON table_reference (column_reference [,column_reference...])
                                Спасибо. Только дело в том что я из индексов использовал только первичный ключ (поставил на автоинкрементное поле). В хелпе Database Desktop нашел такую фразу: первичный индекс в Paradox может быть создан только через определение первичного ключа при создании таблицы. Получается единственное решение - это грохать таблицу и создавать ее заново?
                                Если проблема в падении индексов, то все равно не понятно почему они упали сразу на нескольких таблицах с разной структурой и разным количеством строк!
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0541 ]   [ 16 queries used ]   [ Generated: 19.10.25, 19:32 GMT ]