|
Как после disconnect не потерять пользовательские данные?
|
|||
---|---|---|---|
#18+
Добрый День Всем ! Возникла такая проблема. Пользователь получает данные в dw (Retrieve) и начинает их модифицировать. Через некоторое время связь с сервером рвется . Естественно , в dw остаются записи , которые пользователь не успел сохранить. Вопрос : как не потерять эти данные , которые не успел сохранить пользователь ? PB 8.0 + PFC + OLE DB (MDAC 2.71) + MS SQL 2000 (SP2) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2003, 11:42 |
|
Как после disconnect не потерять пользовательские данные?
|
|||
---|---|---|---|
#18+
Ну дык, сохрани dw куда нить :) (в psr, например) ------------- Сергей Рыжков ЗАО "НПО Балтрос" http://pbl.narod.ru (PowerBuilder + Oracle) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2003, 11:53 |
|
Как после disconnect не потерять пользовательские данные?
|
|||
---|---|---|---|
#18+
Через некоторое время связь с сервером рвется . А поточнее ? Рвется это как - вообще изчезает до лучших времен или же просто теряется соединение и его можно восстановить ? Если первый вариант, то по ответу Sergey Rijkov , если второй - то надо бы обратно восстановить соединение и работать себе дальше. Ну и в зависимости от варианта конечно надо идеологию приложения продумывать - если изначально подразумевается нестабильное соединение, то и модель программы должна быть ориентированна на отложенную работу с сервером, где соединение с сервером происходит только на время операций приложения с БД и предусмотрен режим сохранения данных локально. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2003, 12:12 |
|
Как после disconnect не потерять пользовательские данные?
|
|||
---|---|---|---|
#18+
В PSR-е хранить не стоит, места много а толку мало... внутренние буфера не сохраняет... придется потом "ручками" сравнивать данные. Лучше воспользоваться Get(Set)FullState - выросший из PSR, но храняший все состояние DW. После восстановления коннекта просто восстановиться... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2003, 12:18 |
|
Как после disconnect не потерять пользовательские данные?
|
|||
---|---|---|---|
#18+
Уточняю : рвется временно ( ошибка типа General Network Error). восстановить , конечноже , можно. видимо это какой-то глюк сети. Происходит не часто. Просто я раньше с этим не сталкивался. Меня интересует , можно ли сделать в этом случае так , чтобы программа 1.Переприсоединилась к БД 2.Произвела Update ( без Retrieve ) для dw , в котором остались несохраненные данные пользователя после редактирования и как это примерно должно выглядеть в коде ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2003, 12:21 |
|
Как после disconnect не потерять пользовательские данные?
|
|||
---|---|---|---|
#18+
Правильно я понял , что надо сделать как-то так : ( проверка ошибок опущена ) blob blb_data dw_1.GetFullState ( blb_data ) SQLCA.of_Connect() dw_1.event constructor() // там внутри в т.ч. this.of_SetTransObject(SQLCA)dw_1.Retrieve() dw_1.SetFullState(blb_data ) dw_1.of_Update(TRUE,TRUE) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2003, 12:39 |
|
Как после disconnect не потерять пользовательские данные?
|
|||
---|---|---|---|
#18+
Можно так сделать, хотя при кратковременных отсоединениях, можно просто восстанавливать коннект. Без Get/SetFullState. Get/SetFullState удобна при сбросах на файл при долгих дисконнектах... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2003, 13:00 |
|
Как после disconnect не потерять пользовательские данные?
|
|||
---|---|---|---|
#18+
2 Вовик "dw_1.GetFullState ( blb_data ) SQLCA.of_Connect() dw_1.event constructor() // там внутри в т.ч. this.of_SetTransObject(SQLCA)dw_1.Retrieve() dw_1.SetFullState(blb_data ) dw_1.of_Update(TRUE,TRUE)" Вообще-то update() сама по себе не вызывает retrieve(). Для обработки ошибок БД в dataWindow control есть специальное событие dberror. В самом простейшем (проверки убраны) подобного рода обработка может выглядеть так (для ASA 7.0.4): Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2003, 14:04 |
|
Как после disconnect не потерять пользовательские данные?
|
|||
---|---|---|---|
#18+
Остановился пока на таком коде , вроде работает //Object : datawindow //Event: dberror ..... //попытка переподключения в случае разрыва соединения //провайдер - OLE DB for MS SQL 2000 ( используется PFC ) if sqldbcode=11 or sqldbcode=999 then SQLCA.of_Disconnect() garbageCollect() //Возможно IF SQLCA.of_Connect() = -1 THEN MessageBox('Подключиться Заново не удалось', & uf_sqlerr_ru(),StopSign!) ELSE this.of_SetTransObject(SQLCA) MessageBox('Соединение с Базой Восстановлено', & 'Повторите Операцию') END IF end if //переназначение объекта транзакции // ( для других DW после возникновения disconnect и reconnect) if sqldbcode=-1 then this.of_SetTransObject(SQLCA) MessageBox('Внимание', & 'Повторите Операцию') end if ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 12:43 |
|
Как после disconnect не потерять пользовательские данные?
|
|||
---|---|---|---|
#18+
Я сделал немного по другому - наследовал transaction, в нем сделал: Instance variable public string DBDriverName Функцию, возвращающую код ошибки потери связи с БД function ErrorConnectionFailed() return int Код: plaintext 1. 2. 3. 4. 5. 6.
Функцию подключения к серверу, возвращающую -1 при ошибке, 0 если подключение уже есть и 1 при удачном подключении ConnectDb() return int Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
Функцию отключения от сервера, возвращающую -1 при ошибке, 0 если уже отключен и 1 при удачном отключении DisconnectDb() return int Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Далее на события DataWindow RetrieveStart и UpdateStart можно спокойненько писать примерно следующий код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Все это гарантированно работает, естественно необходимо в проекте указать sqlca на собственный класс transaction, не забыть инициализировать переменную класса DBDriverName и в нее поставить имя драйвера (все никак руки не дойдут сделать его автоматическое получение с ODBC) и расширить функцию ErrorConnectionFailed кодами ошибки потери связи с БД для каждого СУБД. Чем хорошо, что данный вариант не доводит дело до ошибки в DW, при потере сервака молча пытается восстановить соединение и ругается только в тех случаях, когда это необходимо. Чем плохо, что серваку посылается пусть и безобидный, но лишний запрос, хотя такой способ проверки связи используется во многих провайдерах связи (том же BDE). Хотя во всяком случае я может быть так и не заморачивался, но мой transaction делался для централизации работы с подключением и даже может рассылать уведомления о подключениях/отключениях всем заинтересованным обьектам приложения, подписавшимся на его события. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 15:31 |
|
|
start [/forum/topic.php?fid=15&msg=32270129&tid=1339490]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 165ms |
0 / 0 |