powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как после disconnect не потерять пользовательские данные?
10 сообщений из 10, страница 1 из 1
Как после disconnect не потерять пользовательские данные?
    #32270068
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый День Всем !
Возникла такая проблема. Пользователь получает данные в dw (Retrieve) и начинает их модифицировать. Через некоторое время связь с сервером рвется . Естественно , в dw остаются записи , которые пользователь не успел сохранить.

Вопрос : как не потерять эти данные , которые не успел сохранить пользователь ?

PB 8.0 + PFC + OLE DB (MDAC 2.71) + MS SQL 2000 (SP2)
...
Рейтинг: 0 / 0
Как после disconnect не потерять пользовательские данные?
    #32270088
Sergey Rijkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну дык, сохрани dw куда нить :) (в psr, например)

-------------
Сергей Рыжков
ЗАО "НПО Балтрос"
http://pbl.narod.ru (PowerBuilder + Oracle)
...
Рейтинг: 0 / 0
Как после disconnect не потерять пользовательские данные?
    #32270117
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через некоторое время связь с сервером рвется .
А поточнее ? Рвется это как - вообще изчезает до лучших времен или же просто теряется соединение и его можно восстановить ? Если первый вариант, то по ответу Sergey Rijkov , если второй - то надо бы обратно восстановить соединение и работать себе дальше. Ну и в зависимости от варианта конечно надо идеологию приложения продумывать - если изначально подразумевается нестабильное соединение, то и модель программы должна быть ориентированна на отложенную работу с сервером, где соединение с сервером происходит только на время операций приложения с БД и предусмотрен режим сохранения данных локально.
...
Рейтинг: 0 / 0
Как после disconnect не потерять пользовательские данные?
    #32270125
andy753
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В PSR-е хранить не стоит, места много а толку мало... внутренние буфера не сохраняет... придется потом "ручками" сравнивать данные.

Лучше воспользоваться Get(Set)FullState - выросший из PSR, но храняший все состояние DW. После восстановления коннекта просто восстановиться...
...
Рейтинг: 0 / 0
Как после disconnect не потерять пользовательские данные?
    #32270129
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточняю : рвется временно ( ошибка типа General Network Error). восстановить , конечноже , можно. видимо это какой-то глюк сети. Происходит не часто. Просто я раньше с этим не сталкивался.

Меня интересует , можно ли сделать в этом случае так , чтобы программа
1.Переприсоединилась к БД
2.Произвела Update ( без Retrieve ) для dw , в котором остались несохраненные данные пользователя после редактирования

и как это примерно должно выглядеть в коде
...
Рейтинг: 0 / 0
Как после disconnect не потерять пользовательские данные?
    #32270169
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно я понял , что надо сделать как-то так :
( проверка ошибок опущена )
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)
...
Рейтинг: 0 / 0
Как после disconnect не потерять пользовательские данные?
    #32270199
andy753
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так сделать, хотя при кратковременных отсоединениях, можно просто восстанавливать коннект. Без Get/SetFullState.

Get/SetFullState удобна при сбросах на файл при долгих дисконнектах...
...
Рейтинг: 0 / 0
Как после disconnect не потерять пользовательские данные?
    #32270308
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
if sqldbCode = - 85  then
	//Communication Error 
	disconnect using sqlca;
	garbageCollect()         //Возможно необходимо надо разобраться
	connect using sqlca;
	this.settransObject(sqlca)
end if	
...
Рейтинг: 0 / 0
Как после disconnect не потерять пользовательские данные?
    #32271576
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остановился пока на таком коде , вроде работает

//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
...
Рейтинг: 0 / 0
Как после disconnect не потерять пользовательские данные?
    #32271864
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сделал немного по другому - наследовал transaction, в нем сделал:
Instance variable
public string DBDriverName

Функцию, возвращающую код ошибки потери связи с БД
function ErrorConnectionFailed() return int
Код: plaintext
1.
2.
3.
4.
5.
6.
choose case DBDriverName
  case 'ASA'
    return - 85 
end choose

return  0 


Функцию подключения к серверу, возвращающую -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.
// New connection
if DBHandle() =  0  then
  // Connection to server
  Connect using this;

  // Error from connection
  if SQLDBCode <>  0  then
    return - 1 
  end if

  return  1 
end if

// Test already connection
int i

select  1 
into :i
from Dummy;

// Connection is live
if SQLDBCode =  0  then
  return  0 
end if

// Connection failed and unknow status
if SQLDBCode <> ErrorConnectionFailed() then
  return - 1 
end if

// Clear transaction connection
DisconnectDB()

// Recconect from server
Connect using this;

// Server is not found
if SQLDBCode <>  0  then
  return - 1 
end if

// Reconnect successfull
return  1 


Функцию отключения от сервера, возвращающую -1 при ошибке, 0 если уже отключен и 1 при удачном отключении
DisconnectDb() return int
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
// Server already disconnect
if DBHandle() =  0  then
  return  0 
end if

// Disconnect
disconnect using this;

// Error
if SQLDBCode <>  0  then
  return - 1 
end if

// Disconnect successfull
return  1 


Далее на события DataWindow RetrieveStart и UpdateStart можно спокойненько писать примерно следующий код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
choose case sqlca.ConnectDb() 
  case  1 
    SetTransObject( sqlca )
  case - 1 
    MessageBox( 'Error', 'Connection lost' )
    return  1 
end choose

return  0 


Все это гарантированно работает, естественно необходимо в проекте указать sqlca на собственный класс transaction, не забыть инициализировать переменную класса DBDriverName и в нее поставить имя драйвера (все никак руки не дойдут сделать его автоматическое получение с ODBC) и расширить функцию ErrorConnectionFailed кодами ошибки потери связи с БД для каждого СУБД.

Чем хорошо, что данный вариант не доводит дело до ошибки в DW, при потере сервака молча пытается восстановить соединение и ругается только в тех случаях, когда это необходимо. Чем плохо, что серваку посылается пусть и безобидный, но лишний запрос, хотя такой способ проверки связи используется во многих провайдерах связи (том же BDE).

Хотя во всяком случае я может быть так и не заморачивался, но мой transaction делался для централизации работы с подключением и даже может рассылать уведомления о подключениях/отключениях всем заинтересованным обьектам приложения, подписавшимся на его события.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как после disconnect не потерять пользовательские данные?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]