Ошибка DataWindow: строка изменилась между получением и обновлением

Я получаю сообщение об ошибке при обновлении DataWindow, в котором говорится: «Строка изменилась между получением и обновлением». Каково решение?


person Nawshad Farruque    schedule 07.07.2010    source источник


Ответы (7)


Это может произойти, если вы отображаете одни и те же строки в нескольких (не общих) окнах данных, а затем пытаетесь обновить их оба. Другими причинами являются неправильное использование SetItemStatus(); некорректное использование флагов состояния в операторе update(); и, наконец, причина, по которой это предназначено для обнаружения, заключается в том, что другой пользователь обновил строку до вас.

person Hugh Brackett    schedule 07.07.2010
comment
См. также отчет Терри о нарушениях базы данных. - person Hugh Brackett; 07.07.2010

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

Если вы УВЕРЕНЫ, что проблем с параллелизмом нет, вы можете изменить этот параметр на «использовать только значение ключа». Это сделает предложение where для обновлений состоящим только из значения ключа, а другие столбцы не будут оцениваться на наличие изменений.

Это может произойти, если возникают ошибки проверки, вам нужно не забыть установить статус элемента как не измененный. Чтобы установить все строки как неизмененные, вы должны сделать dw_1.setitemstatus(1,0,Primary!,NotModified!), если моя память верна, что установит для всех столбцов первой строки значение NotMofidied!. Вы также можете выполнить ResetUpdate() или повторно получить данные.

надеюсь это поможет. Богатый

person Rich Bianco    schedule 01.09.2010

Обычно это означает, что какой-то столбец, который вы включили в предложение update where, обновляется где-то еще, например, с помощью триггера. другие причины включают отсутствие пустой строки, установленной для строковых столбцов при разговоре с оракулом. oracle преобразует любую пустую строку, отправленную ему, в нули, поэтому последующее обновление не найдет ту же строку, если вы не скажете pb также рассматривать ее как нулевую. посмотрите на столбцы, которые вы сказали pb включить в предложение where (в спецификациях обновления), и убедитесь, что это действительно столбцы, которые вам нужны.

person Bruce Armstrong    schedule 10.10.2010

Я понимаю, что это старый вопрос, но решил добавить свое решение на случай, если оно кому-нибудь поможет. В моем случае окно данных выдавало оператор UPDATE, и когда этот оператор выполнялся в студии управления SQL, возвращаемые столбцы соответствовали ожидаемым. Однако запрос показал два раза, где (1 строка (строки) затронуты). Триггер обновлял строку, не связанную с обновляемой таблицей. Добавление SET NOCOUNT ON к этому триггеру привело к 1 экземпляру, в котором (1 затронута строка(и)), а изменение строки между получением и обновлением было разрешено.

person Pedro    schedule 26.08.2016

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

(Не очень хороший) Пример:

В таблице нет первичного ключа, но в окне данных используется DateOfBirth.

   Name:           Dennis Miller
   DateOfBirth:    19531103
   Vocation:       comedian
   Name:           Kate Capshaw
   DateOfBirth:    19531103
   Vocation:       actress

Обратите внимание, что у Денниса и Кейт одна и та же дата рождения.

Предположим, что эти изменения внесены

   Name:           Mr. Dennis Miller
   Name:           Ms. Kate Capshaw

При вызове dw_1.update() появляется следующее сообщение:

   "Row changed between retrieve and update"

потому что каждая строка обновлялась дважды, сначала с помощью «Mr. Деннис Миллер», а затем с «Ms. Кейт Кэпшоу

person Eric Glenn    schedule 23.04.2012
comment
В этом случае вы можете добавить к ключу пол и почтовый индекс. - person Hugh Brackett; 25.04.2012

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

Пример:

  1. columnA определен в базе данных как char(10)

  2. окно данных построено с столбцом A как char (10)

  3. columnA изменен на char(20) в базе данных

  4. данные добавляются извне в столбец A с более чем 10 символами.

  5. извлечение окна данных усекается до 10 символов (с ошибкой или без нее, в зависимости от настроек приложения).

  6. строка удаления/обновления может дать «Строка изменилась между получением и обновлением»

person Eric Glenn    schedule 29.08.2017

Это поведение отслеживается «Свойствами обновления» вашего окна данных и, в частности, частью «Предложение Where для обновления/удаления». Это управляет предложением «где», которое будет использоваться Powerbuilder при обновлении. удалении, как вы можете проверить, используя событие SQLPreview вашего окна данных:

  1. Ключевые столбцы. В предложении where используются только ключевые столбцы. Если вы используете это, у вас есть риск того, что некоторые столбцы были изменены в другом месте (не обязательно PowerBuilder) между вашим извлечением и вашим обновлением. В БД останется только последнее обновление. Конечно, если сами ключевые столбцы были изменены, вы получите сообщение «Строка изменена».
  2. Ключевые и обновляемые столбцы: поверх ключевых столбцов вы добавляете все обновляемые столбцы, как определено непосредственно ниже, в поле "Обновляемые столбцы". Всякий раз, когда столбец был изменен (опять же, не обязательно с использованием Powerbuilder), строка не будет извлечена, и вы получите сообщение «Строка изменена». Во многих случаях это перебор.
  3. Ключевые и измененные столбцы: к ключу добавляются только столбцы, измененные для определенной строки.
    Теперь вы можете выбрать один из них в зависимости от конкретного контекста вашего приложения.
person Marc Vanhoomissen    schedule 31.08.2017