Ошибка DataWindow: строка изменена между retrieve и update
Я получаю сообщение об ошибке при обновлении окна данных, в котором говорится: "строка изменена между retrieve и update". Каково решение?
7 ответов
Это может произойти, если вы отображаете одну и ту же строку(строки) в нескольких (не общих) окнах данных, а затем пытаетесь обновить их оба. Другими причинами являются неправильное использование SetItemStatus (); неправильное использование флагов состояния в инструкции update (); и, наконец, причина, по которой это предназначено для обнаружения, другой пользователь обновил строку перед вами.
Это было решено? Существует несколько причин, по которым это может произойти, одна из которых-если строка была обновлена другим пользователем. В свойствах update объекта dataobject можно выбрать метод update, используя значения key, key и modified или key и все обновляемые столбцы.
Если вы уверены, что нет проблем с параллелизмом, вы можете изменить этот параметр на "Использовать только значение ключа". Это сделает предложение where для обновлений состоящим только из ключевого значения и другого столбцы не будут оцениваться изменения.
Это может произойти, если возникают ошибки проверки, вы должны помнить, чтобы установить статус элемента не изменен. Чтобы установить все строки не измененными, вы должны сделать dw_1.setitemstatus (1,0, первичный!,NotModified!) если моя память верна, это установит все столбцы для строки один в NotMofidied!. Вы также можете выполнить ResetUpdate() или Reretrieve данных.
надеюсь, что это помогает. Рич!--1-->
это обычно означает, что какой-то столбец, который вы включили в предложение update where, обновляется где-то еще, например, через триггер. другие причины включают отсутствие пустой строки-это null для столбцов строк при разговоре с oracle. oracle преобразует любую пустую строку в null, поэтому последующее обновление не найдет ту же строку, если вы не скажете pb рассматривать ее как null. посмотрите на столбцы, которые вы сказали pb включить в предложение where (в спецификациях обновления), и сделайте конечно, это действительно колонки, которые вам нужно иметь там.
Это также может произойти, если у вас есть две строки datawindow, которые обновляют одну и ту же строку или строки базы данных.
(не очень хороший) пример:
таблица не имеет первичного ключа, но datawindow использует 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"
потому что каждая строка была обновлена дважды, сначала с "г-н Деннис Миллер" , а затем с "г-жа Кейт Кэпшоу"
Я понимаю, что это старый вопрос, но решил добавить свое решение, если это кому-то поможет. В моем случае datawindow выдавал UPDATE
оператор и когда этот оператор был запущен в SQL management studio, возвращаемые столбцы соответствуют тому, что следовало ожидать. Однако, запрос показал два раза, где (1 ряд(ов), пострадавших). Триггер обновлял строку, не связанную с обновляемой таблицей. Добавление SET NOCOUNT ON
на курок привел в 1 случае (1 ряд(ов) ) и строка, измененная между retrieve и update, была разрешена.
другая возможность состоит в том, что определение столбца datawindow не соответствует определению столбца базы данных.
пример:
columnA определяется в базе данных как char (10)
datawindow построен с columnA как char (10)
columnA изменяется на char (20) в базе данных
данные добавляются извне в columnA с более чем 10 письмена.
datawindow получения обрезает до 10 символов (с или без ошибок в зависимости от настроек приложения.)
удалить / обновить строку может дать "строка, измененная между retrieve и update"
Это поведение контролируется "свойствами обновления" вашего окна данных и, более конкретно, частью "предложение Where для Update/Delete". Это управляет предложением where, которое будет использоваться Powerbuilder при обновлении.удаление, как вы могли бы проверить, используя событие SQLPreview вашего Datawindow:
- ключевые столбцы: в предложении where используются только ключевые столбцы. Если вы используете это, вы рискуете, что некоторые столбцы были изменены в другом месте (не обязательно PowerBuilder) между вашим извлечением и обновлением. В БД останется только последнее обновление. Конечно, если ключевые столбцы были изменены, вы получите сообщение "строка изменена".
- ключевые и обновляемые столбцы: поверх ключевых столбцов вы добавляете все обновляемые столбцы, как определено непосредственно под, в поле "обновляемые столбцы". Всякий раз, когда столбец был изменен (опять же не обязательно с помощью Powerbuilder), строка не будет извлечена, и вы получите сообщение "строка изменена". Во многих случаях, это перебор.
-
ключевые и измененные столбцы: в ключ добавляются только столбцы, измененные для определенной строки.
Теперь это до вас, чтобы выбрать один из них, в зависимости от конкретного контекста вашего приложения.