Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Row changed between retrieve and update. ODBC. mySQL  [new]
VovikPB
Member

Откуда: СПб
Сообщений: 5
Собственно работаю через mySQL ODBC 3.51 - возможно корявость отсюда

Суть в следующем.
Делаю retrieve 1 записи, меняю, делаю update.
Проблема возникает когда делаю dw.SetItem() при этом не изменяя данных. Для наглядности пример:
Ритривится appications.cli_id ( = 235)
Делаю dw.SetItem(1, 'cli_id', 444) - все ок
Если делаю dw.SetItem(1, 'cli_id', 235) (то-есть тот-же) то пишет:

"Row changed between retrieve and update.
No changes made to database
UPDATE applications SET CLI_ID = ? WHERE ID = ?"

можно конечно вставить проверку на неравенство, как щас и сделал, но как по-грамотному?
3 ноя 03, 03:07    [403213]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
andy753
Member

Откуда: Moscow
Сообщений: 368
Суть проблемы ясна?
Дело вот в чем. Ошибка возникает в ситуации, когда у тебя есть 2 или более DW, работающих с одними и теми же данными (например, редактирующие одну и ту же запись). Так вот при попытке сохранить данные из этих DW - у тебя и возникает эта ошибка. Причем все это происходит в рамках одного коннекта и скорее всего в рамках одной транзакции, то есть, если разводишь эти DW по разным коннектам - этой ошибка не будет, сохраниться последние изменения.

Как отрабатывать: 2 способа
- либо корректно отрабатывать, т.е. сохранять изменения, делать ретрив, вносить изменения, делать апдейт - то есть то что и рекомендует
- вносить изменения только из одного контрола, в твоем случае - общий список

Ну а в целом - корявость твоего способа чувствуется... ты бы подумал, мож концептуально что-то переделаешь.
3 ноя 03, 10:13    [403418]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
Ikar
Member

Откуда: Москва
Сообщений: 928
2 andy753: Ага, и не забывать commit ставить апосля retrieve и update...
---
С уважением, IKAR
программист-разработчик
PowerBuilder
ikarhomecenter@narod.ru
IkarHomeCenter
3 ноя 03, 12:11    [403679]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
andy753
Member

Откуда: Moscow
Сообщений: 368
само собой :)
3 ноя 03, 12:56    [403785]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
Ikar
Member

Откуда: Москва
Сообщений: 928
2 andy753: Смех-смехом, а я об этом узнал, когда уже пару лет писал на РВ... И, скажем так, сильно удивился и необходимости онного, и результатам...

---
С уважением, IKAR
программист-разработчик
PowerBuilder
ikarhomecenter@narod.ru
IkarHomeCenter
3 ноя 03, 16:56    [404372]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
andy753
Member

Откуда: Moscow
Сообщений: 368
:)) я с этим сжился уже... так как мои юзера очена любили по неделе проги не выключать. Соо-но блокировки быстро заставили в этом разобраться :))
3 ноя 03, 17:45    [404520]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
VovikPB
Member

Откуда: СПб
Сообщений: 5
Возможно проблему не поняли

автор писал:
Дело вот в чем. Ошибка возникает в ситуации, когда у тебя есть 2 или более DW, работающих с одними и теми же данными (например, редактирующие одну и ту же запись). Так вот при попытке сохранить данные из этих DW - у тебя и возникает эта ошибка. Причем все это происходит в рамках одного коннекта и скорее всего в рамках одной транзакции, то есть, если разводишь эти DW по разным коннектам - этой ошибка не будет, сохраниться последние изменения.


Ситуация, описанная выше очевидна, но!
Есть только 1 DW редактирующая эту запись.
Все ОК работает на оракле (т.е. код-то нормальный, портирую на mySQL по ряду причин)


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


так и делается

автор писал:
вносить изменения только из одного контрола


и это тоже так

объясняю по порядку еще раз:
retrieve 1 записи в dw_edit.Retrieve(al_id)
делаю dw_edit.SetItem()
делаю dw_edit.AcceptText()
делаю dw_edit.Update()
делаю COMMIT; если успешно
никак больше эта запись одновременно не редактируется
3 ноя 03, 19:45    [404712]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
cbusel
Member

Откуда: gomel.by
Сообщений: 54
Вообще то сия ошибка означает только то, что update проапдейтил не одну запись (sqlca.sqlnrows <> 1). Может MySql настолько умный, что отбрасывает подобные апдейты?
3 ноя 03, 21:12    [404777]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
cbusel
Сие есть ерунда
автор писал:
Вообще то сия ошибка означает только то, что update проапдейтил не одну запись


Ошибка эта означает, что WHERE CLAUSE, которую сгенерил datawindow НЕ НАШЛА ряд, который updatать пытались...

VovikPB, каков datatype cli_id в БД, и каков в datawindow ?

И кстати, вот это:
автор писал:
делаю dw_edit.SetItem()
делаю dw_edit.AcceptText()
делаю dw_edit.Update()

Зачем там dw_edit.AcceptText() ? Убери.
3 ноя 03, 22:01    [404810]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
cbusel
Member

Откуда: gomel.by
Сообщений: 54
2Филипп
автор писал:
Зачем там dw_edit.AcceptText() ? Убери.

Нельзя ли привести пример, когда AcceptText вредил?

Нельзя ли узнать как PB определяет, что
автор писал:

что WHERE CLAUSE, которую сгенерил datawindow НЕ НАШЛА ряд, который updatать пытались...
3 ноя 03, 22:44    [404841]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
Ikar
Member

Откуда: Москва
Сообщений: 928
2 andy753:
andy753 писал:
так как мои юзера очена любили по неделе проги не выключать.

Ну, эт крутовато! А вставить ченить навроде обязательного "Закрытие дня/смены"?
---
С уважением, IKAR
программист-разработчик
PowerBuilder
ikarhomecenter@narod.ru
IkarHomeCenter
4 ноя 03, 08:01    [404950]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
andy753
Member

Откуда: Moscow
Сообщений: 368
А вставить ченить навроде обязательного "Закрытие дня/смены"? 


А зачем? Не проще сделать приложение устойчивым? Или мы теперь все уподобимся дяде Биллу?
4 ноя 03, 09:51    [405038]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
ЗоринАндрей
Member

Откуда: Санкт-Петербург
Сообщений: 3004
автор писал:
Филипп:Cие есть ерунда
cbusel: Вообще то сия ошибка означает только то, что update проапдейтил не одну запись
Филипп:Ошибка эта означает, что WHERE CLAUSE, которую сгенерил datawindow НЕ НАШЛА ряд, который updatать пытались...


Оба правы. проапдейтил не одну запись и не проапдейтил ни одной это одно и то же.

VovikPB:
А что у нас там в Update properties -> where clause?
Может имеет смысл делать Update(False, False) и потом только после успешного Update ResetUpdate?

andy753 + Ikar:
мы вам не мешаем? ;-)


Зорин А.

"I love deadlines. I like the whooshing sound they make as they fly by."
-- Douglas Adams
4 ноя 03, 10:02    [405055]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
VovikPB
Member

Откуда: СПб
Сообщений: 5
автор писал:
Зачем там dw_edit.AcceptText() ? Убери.

А затем, если юзверь меняет что-то в датавинде а потом сразу мышкой на кнопку "Сохранить" жмакает, чтобы это "что-то" сохранилось

автор писал:
When a user moves from item to item in a DataWindow control, the control validates and accepts data the user has edited. When a user modifies a DataWindow item then immediately changes focus to another control in the window, the DataWindow control does not accept the modified data—the data remains in the edit control. Use the AcceptText function in this situation to ensure that the DataWindow object contains the data the user edited.


А что у нас там в Update properties -> where clause?[/quot]
Update properties простые:
Where clause...: Key columns
Unique Key Column(s): id
Key modifications: Use Delete then Insert
автор писал:


[quot автор]VovikPB, каков datatype cli_id в БД, и каков в datawindow?

cli_id - bigint(20)
datawindow - freeform
4 ноя 03, 13:35    [405475]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
ЗоринАндрей
Member

Откуда: Санкт-Петербург
Сообщений: 3004
Какой UPDATE генерирует DW?
т.е. ставим в DBParm : DisableBind=1 и смотрим sqlsyntax в sqlpreview Event.
надо выяснить почему Update не находит запись - какой параметр подставляется в where id = ?
4 ноя 03, 14:03    [405549]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
Если вот это
автор писал:
А затем, если юзверь меняет что-то в датавинде а потом сразу мышкой на кнопку "Сохранить" жмакает, чтобы это "что-то" сохранилось
не для смеха написано, то тогда должно быть так:
IF dw_edit.AcceptText() <> 1 THEN RETURN

dw_edit.SetItem()
dw_edit.Update()
4 ноя 03, 18:35    [406242]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
автор писал:
Оба правы. проапдейтил не одну запись и не проапдейтил ни одной это одно и то же
- это заявление есть глупость.
Если получаешь сей мессадж Row changed between retrieve and update, значит речь идёт об одном и ТОЛЬКО одном ряду.
4 ноя 03, 18:40    [406255]     Ответить | Цитировать Сообщить модератору
 Re: Row changed between retrieve and update. ODBC. mySQL  [new]
cbusel
Member

Откуда: gomel.by
Сообщений: 54
автор писал:
update проапдейтил не одну запись (sqlca.sqlnrows <> 1)

Я опять был неправ. По видимому булдырь проверяет только sqldbcode.
5 ноя 03, 12:15    [407121]     Ответить | Цитировать Сообщить модератору
 А на самом деле все оказалось так:  [new]
Vovik@PB
Member

Откуда: Санкт-Петербург
Сообщений: 67
Описанная выше ошибка пропала при выставлении в настройках ODBC драйвера галочки напротив пункта Return matching rows (которая по умолчанию девственно чиста). Интересно будут ли побочные эффекты?
16 дек 03, 21:16    [462411]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить