Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
11-1199738391
=BuckLr=
2008-01-07 23:39
2009.04.19
BidiMode


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


1-1211299976
nicestep
2008-05-20 20:12
2009.04.19
Параллельный порт. Асинхронная запись/чтение


2-1235949145
WeX
2009-03-02 02:12
2009.04.19
Помогите с TTreeView


1-1210103637
andreil
2008-05-06 23:53
2009.04.19
Дельфийские аналоги функций _lrotr и _lrotr





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский