Форум: "Базы";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.059 c