Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.19;
Скачать: CL | DM;

Вниз

ADO. переподключение после обрыва соединения   Найти похожие ветки 

 
Max Zyuzin ©   (2008-08-20 12:08) [0]

Приветствую Всех!

Есть довольно объемный проект. Работа с MSSQL ведется через ADO. До тех пор, пока пользователи все сидели в локальной сети проблем не было. Но вот возникла необходимость подключить удаленных пользователей. Через VPN они "смотрят" в сеть и подключаются к серверу.

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

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

Нашел вот такое обсуждение
http://www.sql.ru/forum/actualthread.aspx?tid=376842
Ошибка отлавливается, происходит пересоединение, после которого все равно вываливается ошибка соединения хотя вроде все пересоеденилось...


 
Sergey13 ©   (2008-08-20 12:51) [1]

А тебе, я так думаю, хочется, что бы все, ранее открытые, датасеты, после переподключения остались валидны?


 
Max Zyuzin ©   (2008-08-20 14:21) [2]

>Sergey13 ©   (20.08.08 12:51) [1]
Ну да... есть такое желание


 
stas ©   (2008-08-20 14:24) [3]

Max Zyuzin ©   (20.08.08 12:08)

Если уничтожить и создать конекшин, тогда переподключишься.
но это тоже криво.

Сам искал как это седелать - не нашел.


 
Ega23 ©   (2008-08-20 14:37) [4]


> Ну да... есть такое желание


Нереально. Разве что одним махом отключить все DataSet-ы от коннекшена, запомнить во всех позиции курсора, переподключиться, подсоединить к новому коннекшену все датасеты, переоткрыть каждый, залокейтить на сохранённую позицию.
Как-то так.


 
Sergey13 ©   (2008-08-20 14:59) [5]

> [2] Max Zyuzin ©   (20.08.08 14:21)

Коннект отваливается не только у клиента, но и у сервера. И ему глубоко фиолетово ты заново подключаешься или переподключаешься. Он все равно новую сессию открывает, выделяет тебе всякие ресурсы заново и т.д. и т.п.
Это я по опыту работы с Ораклом в основном говорю, с МС у меня нет большого опыта общения. Но не думаю, что эти вещи у них сильно различаются.


 
Max Zyuzin ©   (2008-08-20 15:08) [6]

>Ega23 ©   (20.08.08 14:37) [4] & Sergey13 ©   (20.08.08 14:59) [5]
В общем подумал что позиции курсора можно и не сохранять. Но уже понимаю что придется переоткрывать все активные датасеты.


 
Ega23 ©   (2008-08-20 15:20) [7]


> В общем подумал что позиции курсора можно и не сохранять.


Лучше сохранить. Только не букмарками - они инвалидны после переоткрытия. Запоминай значения ключевых полей.


 
Sergey13 ©   (2008-08-20 15:47) [8]

> [6] Max Zyuzin ©   (20.08.08 15:08)
> Но уже понимаю что придется переоткрывать все активные датасеты.

Только надо хорошенько подумать стОит ли это делать, ИМХО. Возможно самым правильным будет вывести пользователю сообщение типа "Связь в сервером потеряна. Перезапустите программу". Чего он там понаоткрывал, в какой последовательности, с какими параметрами? Сможешь однозначно определить? Если приложение достаточно сложное, то можно за чем нибудь не уследить и наделать таких делов, что после них только заявление по собственному писать.
ИМХО.


 
MsGuns ©   (2008-08-20 15:52) [9]

Не надо заниматься дурью - для удаленного использовать TClientDataSet с перечиткой по требованию и никакими правками в БД.
Клиент будет "зависать" только при перечитках, которые сам  же и запускает. При этом ничего не будет "теряться" и данные будут актуализироваться по требованию, что интуитивно прозрачно даже для самого "темного" узера


 
Max Zyuzin ©   (2008-08-20 16:02) [10]

>MsGuns ©   (20.08.08 15:52) [9]
В программе уже сделано очень много ADODataSet, ADOCommand и немного ADOQuery. Заменять их на ClientDataSet не получится


 
MsGuns ©   (2008-08-20 16:07) [11]

Ну тогда веники


 
Anatoly Podgoretsky ©   (2008-08-20 16:18) [12]

Последствия визуальности, кардинальное решение в [8], можно и без перезагрузки, а начать с главной формы и переоткрытия (через меню или автоматом). Можно в принципе пересмотреть и подход - ничего не открывать раньше времени и это делать каждый раз при операции. Конечно требует переделки и переосмысления работы.


 
Max Zyuzin ©   (2008-08-20 16:39) [13]

Решил поступить кардинально... [8] всем спасибо.


 
BoxTer   (2008-08-25 12:46) [14]

procedure TDM.ReconnectBD;
var DSCount,DSOpenedCount,i:integer;
   ms:array[1..100,1..2] of integer;
Begin
MessageDlg("Потеряна связь с сервером базы данных! Попытаемся восстановить...",mtWarning,[mbOk],0);
DSCount:=ADOConnection1.DataSetCount;
DSOpenedCount:=0;
//запоминаем открытые ДС и номер строки
for i:=1 to DSCount do
  if ADOConnection1.DataSets[i-1].Active then Begin
     DSOpenedCount:=DSOpenedCount+1;
     ms[DSOpenedCount,1]:=i;
     ms[DSOpenedCount,2]:=ADOConnection1.DataSets[i-1].RecNo;
  end;
try
 ADOConnection1.Close;
 ADOConnection1.Open;
except
   if MessageDlg("Ошибка подсоединения к серверу базы данных!",mtError,[mbRetry,mbAbort],0)=mrAbort then Begin MainForm.Close; Exit; end
                  else ReconnectBD;
end;
//включаем и позиционируем
 try
  for i:=1 to DSOpenedCount do Begin
     ADOConnection1.DataSets[ms[i,1]-1].Active:=True;
     ADOConnection1.DataSets[ms[i,1]-1].RecNo:=ms[i,2];
  end;
 except
    exit;
 end;
end;


Процедура вызывается в Таймере запросом Select 1
В многооконных приложениях накладнее будет просто предложить юзеру перезайти. Т.к. возможна ситуация, когда будет набран, но не сохранен большой документ.


 
Ega23 ©   (2008-08-25 13:04) [15]


> ms[DSOpenedCount,2]:=ADOConnection1.DataSets[i-1].RecNo;


Сразу фтопку можно выбросить.


 
MsGuns ©   (2008-08-25 15:36) [16]

>BoxTer   (25.08.08 12:46) [14]

Замечательная по своему идиотизму и реализации идея


 
Ega23 ©   (2008-08-25 16:22) [17]

Ой, она ещё и рекурсивная.....
Какой ужас...


 
Polevi ©   (2008-08-26 08:07) [18]

использовать отсоединенные дайтасеты
а лучше вообще дэйтасеты не использовать


 
BoxTer   (2008-08-26 08:32) [19]

а причину указать?


 
Anatoly Podgoretsky ©   (2008-08-26 08:56) [20]

> BoxTer  (26.08.2008 8:32:19)  [19]

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


 
Ega23 ©   (2008-08-26 10:05) [21]


> а причину указать?


А ты ничего такого не видишь? Я даже строчку кода привёл, за который "фтопку".
Конкретно - RecNo. Ещё конкретнее - чуть-чуть подумай.



Страницы: 1 вся ветка

Текущий архив: 2009.04.19;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
2-1236238837
EWGhack
2009-03-05 10:40
2009.04.19
Хочу написать прогу но незнаю с чего начать


15-1234992602
Юрий
2009-02-19 00:30
2009.04.19
С днем рождения ! 19 февраля 2009 четверг


1-1211146906
Shadow
2008-05-19 01:41
2009.04.19
зайди там все объяснено!


6-1202129355
kDenis
2008-02-04 15:49
2009.04.19
winhttp.dll


15-1235076565
Sergey Masloff
2009-02-19 23:49
2009.04.19
SOAP в Delphi. Что делать с зависонами