|
|
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Попробую вначале здесь, т.к. вероятность найти людей PB + Oracle тут больше. Если пойму что не тут проблема, пойду в Оракл. Ситуация следующая программа разработана на PB 9.0.1 Version 7119 БД Оракл 9.2.0.5 Клиент Оракл Сейчас установил программу достаточено удаленному пользователю, да еще и с каналом 64к. И возникла проблема - теряются введенные данные. Процес в следующем: есть dw , в котором на событие Insert, update висят процедуры Оракла. Пользователь набивает допустим строк 50 новых, сохраняет. Потом заходит в программу - а данных нет. Также описывает следующую ситуацию набивает сохраняет, опять набивает - сохраняет, в итоге определенной кол-во всеравно пропадает. Если кто сталкивался с этим, подскажите куда лезть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 16:48 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
хм... а commit происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:02 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Я не понял, он после набора выходит из программы? Может, если он "достаточно удаленный" просто часть данных не доходит (разрыв коннекта) или не доходит COMMIT? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:09 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
commit стоит после того как сохранил вот код integer li_result li_result = MessageBox('Ñîõðàíåíèå.', 'Âû õîòèòå ñîõðàíèòü èíôîðìàöèþ?', Question!, YesNoCancel!, 1) Choose Case li_result Case 1 dw_group.Event pfc_update(True, True) dw_detail.Event pfc_update(True, True) If SQLCA.SQLCode < 0 Then MessageBox( "SQL error", SQLCA.SQLErrText); SQLCA.of_rollback( ) Else SetPointer(HourGlass!) SQLCA.of_commit( ) cb_save.Enabled = False End If Case 2 dw_group.ResetUpdate() dw_detail.ResetUpdate() Case 3 Return -1 End Choose cb_save.Enabled = False ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:11 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Данная проблема возникла только у юзеров, которые удаленно работаю. Сейчас в процессе получения нового канала, но сам "звоночек" мне не понравилось и пока канал не расширили, хочу разобраться в чем проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:14 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Я в Оракле ничего не понимаю , но, отвлекаясь от конкретной СУБД, я бы попробовал каким-нибудь образом выяснить, что именно доходит с этого клиента до сервера. Будет хоть какая-то пища для ума. ____________________________________ - Гарфилд, мышь! - Спасибо, я сыт! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:15 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Dim2000Я в Оракле ничего не понимаю , но, отвлекаясь от конкретной СУБД, я бы попробовал каким-нибудь образом выяснить, что именно доходит с этого клиента до сервера. Будет хоть какая-то пища для ума. ____________________________________ - Гарфилд, мышь! - Спасибо, я сыт! Это разумно, я сам хотел предложить после ответа на вопрос. Можно для сессии включить трассировку на сервере (правда трассировочный файл тоже будет на сервере). Если с этим проблем нет, то это самое то для локализации ошибки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:23 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
На 64К канале не пробовал, а на 128, по которому, кроме всего прочего, передавался еще и voice, проблем замечено не было. Клиент в Москве, сервер - в Самаре. Теперь общие соображения. Приведенный код не может не настораживать - может быть, все дело в драйвере DirectHand.sys? Код: plaintext 1. 2. 3. 4. Ну и messagebox перед rollback - тоже не самый лучший стиль программирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 18:08 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Да и вообще, каким образом по If SQLCA.SQLCode < 0 Then можно пытаться судить о результате операции Update на datawindow контроле? Поже это не DirectHand.sys а DirectBrain.sys шалит :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 20:01 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Пробывал заливать блоб(~100к) в Оракле(8и) из Билдера(9), правда без ПФЦ, на канале 33600 - всё получается замечательно. Если во время закачки на сервер связь разрывалась, то получал ошибку -1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 06:41 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Pasha .... SQLCA.of_rollback( ) Else SetPointer(HourGlass!) SQLCA.of_commit( ) .... SetPointer(HourGlass!) - зачем перед SQLCA.of_commit( ), лучше перед SQLCA.of_rollback( ). COMMIT достаточно быстрая операция, чего не скажешь о ROLLBACK (я имею ввиду Оракле). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 06:48 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
В таком режиме, наверное, перед всеми операциями с базой нужно проверять коннект. А далее, в зависимости от результата проверки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 07:21 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы, начну по порядку PL99Какие основания считать, что dw_group успешно сохраняется? Почему вообще сделано два вызова pfc_update вместо pfc_save в окне? Вчера еще до вашего сообщения начал переделывать, посмотрим что покажет. PL99Ну и messagebox перед rollback - тоже не самый лучший стиль программирования. Был бы признателен, чем плох этот стиль ГеннадичПробывал заливать блоб(~100к) в Оракле(8и) из Билдера(9), правда без ПФЦ, на канале 33600 - всё получается замечательно. Если во время закачки на сервер связь разрывалась, то получал ошибку -1. Самое что интересное, в этой программе очень много приходится работать с блобом, так за время тестирования, порядка 2 недель, с блобом ниразу проблем не было. Проблема возникла именно с одним местом, где просто тупо набивается часто список людей. ГеннадичSetPointer(HourGlass!) - зачем перед SQLCA.of_commit( ), лучше перед SQLCA.of_rollback( ). COMMIT достаточно быстрая операция, чего не скажешь о ROLLBACK (я имею ввиду Оракле). Этот код бывает еще вылезает от эпохи использования Mat. view, тогда процесс сохранения долгий был Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 09:23 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Pasha PL99Ну и messagebox перед rollback - тоже не самый лучший стиль программирования. Был бы признателен, чем плох этот стиль Тем, что изменения в базе откатываются после нажатия на кнопку ОК. Если пользователь ушел покурить, то все, кто попытается изменить данные, затронутые транзакцией первого пользователя тоже будут курить, пока первый не нажмет на ОК. На блокировочниках же пользователи даже не смогут прочитать данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 09:41 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Локшин МаркТем, что изменения в базе откатываются после нажатия на кнопку ОК. Если пользователь ушел покурить, то все, кто попытается изменить данные, затронутые транзакцией первого пользователя тоже будут курить, пока первый не нажмет на ОК. На блокировочниках же пользователи даже не смогут прочитать данные. Спасибо, важное замечание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 09:51 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Поэксперементировал я вначале с PB и есть некоторые рез-ты, жаль положительных мало. Начну по порядку PL99Почему вообще сделано два вызова pfc_update вместо pfc_save в окне в инициализации окна //*************** update setting ********************************* lpo_objs[1] = dw_group lpo_objs[2] = dw_detail of_SetUpdateObjects(lpo_objs) //**************************************************************** на нажатие кнопки делаю li_return = event pfc_save() Результат 0 ФилиппДа и вообще, каким образом по If SQLCA.SQLCode < 0 Then можно пытаться судить о результате операции Update на datawindow контроле? почитал хелп, книжки. переделал li_return = dw_group.Event pfc_update(True, True) If SQLCA.SQLNRows > 0 Then MessageBox('commit','group ' + string(li_return)) Else SetPointer(HourGlass!) MessageBox('roll back','group ' + string(li_return)) End If li_return = dw_detail.Event pfc_update(True, True) If SQLCA.SQLNRows > 0 Then SQLCA.of_commit( ) MessageBox('commit','detail ' + string(li_return)) Else SetPointer(HourGlass!) SQLCA.of_rollback( ) MessageBox('roll back','detail ' + string(li_return)) End If Получается li_return = 1, но SQLNRows не больше 0, по этому все попадает на RollBack PL99Ну и messagebox перед rollback - тоже не самый лучший стиль программирования. Есть интересная вешь, данная мессага нам позволяла быстро исправлять ошибки. Если выскакивало данное сообщение, юзер делает принтскрин и вставляет в файл который в момент до нас долетает. Пойду в оракле копаться. Где проблема пока не знаю, т.к. данные сохраняются, но не всегда надо это "не всегда" исправить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 12:16 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Новый код тоже логически неверен. Необходимо делать COMMIT только тогда, когда прошел И update родительской таблицы, И update дочерней ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 12:59 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
автор//*************** update setting ********************************* lpo_objs[1] = dw_group lpo_objs[2] = dw_detail of_SetUpdateObjects(lpo_objs) //****************************************************************в чем смысл приведенного кода? Окно не является потомком w_master? Или объекты создаются динамически в runtime? Если на оба вопроса ответ - нет и если оба DW updatable, то будут обновляться автоматически. авторli_return = event pfc_save() Результат 0li_return = 0 - значит в DW не было изменений Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Все процессы управления транзакциями в PFC вынесены в соответствующие события, не надо на кнопках никагого лишнего кода писать. Рекомендации по телодвижениям с бубном: Посмотреть на клиенте какие sql-запросы отсылаются на сервер Посмотреть на сервере, что из отправленного доходит до сервера Сделать правильные выводы :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 13:49 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Pasha ФилиппДа и вообще, каким образом по If SQLCA.SQLCode < 0 Then можно пытаться судить о результате операции Update на datawindow контроле? почитал хелп, книжки. переделал li_return = dw_group.Event pfc_update(True, True) If SQLCA.SQLNRows > 0 Then MessageBox('commit','group ' + string(li_return)) Else SetPointer(HourGlass!) MessageBox('roll back','group ' + string(li_return)) End If li_return = dw_detail.Event pfc_update(True, True) If SQLCA.SQLNRows > 0 Then SQLCA.of_commit( ) MessageBox('commit','detail ' + string(li_return)) Else SetPointer(HourGlass!) SQLCA.of_rollback( ) MessageBox('roll back','detail ' + string(li_return)) End If Получается li_return = 1, но SQLNRows не больше 0, по этому все попадает на RollBack Где это вы такую книжку нашли, что почитав её написали ту же самую ерунду как и до моего вопроса? Команда dw_whatever.Update() никаким образом не влияет на свойтсва SQLCA... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 19:54 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
2 Филипп Powerbuilder Help As before, this example connects to the database, specifies a transaction object for the DataWindow control with SetTransObject, and then updates the database with the changes made in dw_employee. After Update is executed, the example checks the return code and depending on the success of the update, executes a COMMIT or ROLLBACK: integer rtn CONNECT USING SQLCA; dw_employee.SetTransObject(SQLCA) rtn = dw_employee.Update() IF rtn = 1 AND SQLCA.SQLNRows > 0 THEN COMMIT USING SQLCA; ELSE ROLLBACK USING SQLCA; END IF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 08:57 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Pasha2 Филипп Powerbuilder Help As before, this example connects to the database, specifies a transaction object for the DataWindow control with SetTransObject, and then updates the database with the changes made in dw_employee. After Update is executed, the example checks the return code and depending on the success of the update, executes a COMMIT or ROLLBACK: integer rtn CONNECT USING SQLCA; dw_employee.SetTransObject(SQLCA) rtn = dw_employee.Update() IF rtn = 1 AND SQLCA.SQLNRows > 0 THEN COMMIT USING SQLCA; ELSE ROLLBACK USING SQLCA; END IF Это не есть ПФС, а ты юзаешь ПФС ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 10:28 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Я пробовал как с ПФС, так и без. А пройдя далее по ПФС, заканчивается тем же самым Update(). Если я не прав, то буду признателен, если поправите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 10:36 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Pasha2 Филипп Powerbuilder Help ... rtn = dw_employee.Update() IF rtn = 1 AND SQLCA.SQLNRows > 0 THEN Выделенное условие не имеет смысла после dw.Update(), т.к. этот метод не меняет состояние SQLCA. Видимо пример остался в справке со времен когда было по-другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 11:20 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky Выделенное условие не имеет смысла после dw.Update(), т.к. этот метод не меняет состояние SQLCA. Видимо пример остался в справке со времен когда было по-другому. Понятно спасибо. А вот условие SQLCA.SQLCode показывает, была ли ошибка при сохранении или нет. По крайней мере я тестировал следующие варианты: 1) не введено обязательно поле 2) неверно настроена процедура на событие Insert/Update/Delete 3) если после ввода данных, перед сохранением, выдернуть сетевой шнур, т.е. грубо симетировать потерю связи с сервером. Ну если поидии и это не должно работать, то к сожалению или к радости, у нас работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 11:37 |
|
||
|
PB и Oracle для удаленного юзера
|
|||
|---|---|---|---|
|
#18+
PashaА вот условие SQLCA.SQLCode показывает, была ли ошибка при сохранении или нет. По крайней мере я тестировал следующие варианты: 1) не введено обязательно поле 2) неверно настроена процедура на событие Insert/Update/Delete 3) если после ввода данных, перед сохранением, выдернуть сетевой шнур, т.е. грубо симетировать потерю связи с сервером. Ну если поидии и это не должно работать, то к сожалению или к радости, у нас работает. Состояние объекта transaction НЕ меняется при .Update(), .Retrieve(). Значит, если у Вас SQLCA.SQLCode показывает ошибку, то она там была еще до .Update(), или по-крайней мере вызвана вне DW, например, где-то раньше есть вызов Embedded SQL, который вызвал ошибку. Поэтому ловить ошибку надо только проверкой возвращаемого значения .Update(), а в событии dberror смотреть подробности ошибки в его аргументах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 12:45 |
|
||
|
|

start [/forum/topic.php?fid=15&fpage=89&tid=1338491]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
24ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 371ms |

| 0 / 0 |
