Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Правильное отключение (AdoConnection) [D7, MSSQL]


Страницы:   1 2

Stanislav ©   (2006-11-07 17:10:00) 

Мне нужно чтобы мое приложение выполнило запрос к серверу и отключилось. делаю так:
AdoDataSet.open;
...
AdoDataSet.close;
AdoConnection.Close
Но процесс на сервере все еще остается.
Как сделать чтобы он сразу отключался?


Stanislav   (2006-11-09 10:30:00) [1]

Простой пример.
Форма 3 кнопки.
1-я кнопка
AdoConnection.open;
2-я кнопка
AdoConnection.Close;
3-я кнопка
ADOConnection.free;
Запускаю приложение и Enterprise Manager
Нажимаю 1-ю кнопку, Обновляю в EM список процессов
-мой процесс появился
Нажимаю 2-ю кнопку, Обновляю в EM список процессов
-мой процесс остался
Нажимаю 3-ю кнопку, Обновляю в EM список процессов
-мой процесс пропал.
Получается что ADOCOnnection держит процесс даже, когда он закрыт (судя по словам Sniknik это продолжается некоторое время, только сколько?).
При обрыве сети сервер убивает процесс, после восстановления ADOConnaection пытается восстановить подключение с тем же процессом, но на сервере его нет и Connection выдает ошибку.


ЮЮ   (2006-11-09 09:23:00) [2]


> То есть работоспособность программы гарантируется только
> до первой потери соединения

Даже БДЕ восстатавливает соединение после потери, слегка ругнувшишь.  
Стыдно выдавать нечто, "гарантирующее работоспособность только до первой потери соединения"за программу :)


Anatoly Podgoretsky   (2006-11-09 09:01:00) [3]


> Это твое мнение. Мое прямо противоположное.

Иначе как бы тогда вообще могли работать программы, запуск программы приводит именно к переоткрытию. То есть работоспособность программы гарантируется только до первой потери соединения, зачем надо к автору обращаться за новой версией, эта уже отработала свое.


Stanislav   (2006-11-09 08:41:00) [4]

ЮЮ ©   (09.11.06 03:57) [28]
Сегодня попробую, в течении дня напишу.


ЮЮ   (2006-11-09 03:57:00) [5]


> Но вопрос в том что после неудачного подключения конекшин
> уже подключение не восстановит. Хоть переоткрывай его хоть
> что.


Это твое мнение. Мое прямо противоположное. Будто бы у меня коннект иногда не теряется? Тем не менее нажав на кнопочки "Разорвать связь" ADOConnection.Connected := False и  "Устаговить связь" ADOConnection.Connected := True, я получаю нормальное соединение.


Anatoly Podgoretsky   (2006-11-08 14:18:00) [6]


> Использую ADO, почему DBEXPRESS, тип Курсора fowardonly.

Прошу прощения, рядом идет паралельное аналогичное обсуждение, перепутал ветки.
Но если fowardonly то какой еще dbgrid так что ответ правильный, технология просто перепутана. Это для ЮЮ

fowardonly это однонаправленный курсор, а dbgrid требует двухнаправленного.
Это замечание к цитате

> он же в DBGride показывается?


Stanislav   (2006-11-08 13:40:00) [7]

Использую ADO, почему DBEXPRESS, тип Курсора fowardonly.


Anatoly Podgoretsky   (2006-11-08 12:23:00) [8]

> ЮЮ  (08.11.2006 10:39:19)  [19]

Какой еще dbgrid для DbExpress и к тому же там просто нет места для торможения, для того это и было придумано. Облегченный однонаправленый доступ без курсора.


Stanislav   (2006-11-08 11:46:00) [9]

ЮЮ ©   (08.11.06 11:34) [23]
В этом примере он делает 10 попыток подключения.
Но вопрос в том что после неудачного подключения конекшин уже подключение не восстановит. Хоть переоткрывай его хоть что.


ЮЮ   (2006-11-08 11:34:00) [10]

connected := false;
attempts := 0;
repeat
 try
   Inc(attempts);
   AdoDataset1.Open;
   connected := true;
 except
   AdoConnection1.Close;
   AdoConnection1.Open;
 end;
until connected or (attempts > 10);

А тут уж смотри, что доллжна делать программа, если не удается установить связь с сервером. Или повторить это же по таймеру через некоторое время или ShowMessage('Сбой подключения') показать. Какая разница?


Stanislav   (2006-11-08 11:27:00) [11]

т.е. вот так, и в доп. потоке тоже убрать отключение.
AdoDataSet1.Close;
//ADOConnection1.Connected:=false;
try
AdoDataset1.Open;
except
AdoConnection1.Close;
ShowMessage('Сбой подключения')
end;
Но это все равно не решит роблему.


ЮЮ   (2006-11-08 11:17:00) [12]

И все-таки, я бы не стал рвать/устанавливать соединение каждые три минуты, а делал бы это тольк в случае невозможности открытия запроса - т.е. реальных проблемах с соединением. Лампочки при этом бы гасли. Зажигалась alarm-мигалка и сирена.


Stanislav   (2006-11-08 10:52:00) [13]

Грида нет. Есть объекты с лампочками (картинки из Imagelist), лампочка может быть либо красной либо зеленой, в зависимости от состояния (true/false), а также у каждого объекта есть значение keyvalue. А запросом запрашивается список ключей и состояний, которые нужно записать в объекты. Запись происходит в цикле, после чего запрос закрывается.
На главной форме ничего не происходит, доп. поток для того чтобы форму можно было нормально передвигать. В доп. потоке все нормально.


ЮЮ   (2006-11-08 10:39:00) [14]

А что на той форме такого в этот момент есть, если DataDet сканируется в допюпотоке. На основной форме, небось, он же в DBGride показывается?
А без сканирования обойтись нельзя? - получить всё нужное одним (быстрым) запросом - ведь MS SQL всё-таки.


Stanislav   (2006-11-08 10:35:00) [15]

ЮЮ ©   (08.11.06 09:33) [16]
Доп. поток для того чтобы основная форма  не тормозила.


Stanislav   (2006-11-08 10:27:00) [16]

Anatoly Podgoretsky ©   (08.11.06 09:28) [14]
Он автоматически открывается. С этим проблем нет.


ЮЮ   (2006-11-08 09:33:00) [17]


> Хотя на самом деле код сложнее, на DataSet1.AfterOpen запускается
> доп. поток с перебором всех записей в датасете, и в нем
> закрывается Connection, но дополнительно я написал закрытие
> Коннекта перед открытием датасета на OnTimer.


Да уж.
Может коннект вообще не трогать? Переоткрывать только по необходимости - при сбое открытия запроса. А доп. поток зачем? В основном то что в этот момент можно делать, если к коннекту и приказаться нельзя?


Anatoly Podgoretsky   (2006-11-08 09:29:00) [18]

> ЮЮ  (08.11.2006 07:54:10)  [10]

> у тебя до закрытия битого коннект просто дело не доходит:

У него до открытия не только битого, но и не битового дело не доходит


Anatoly Podgoretsky   (2006-11-08 09:28:00) [19]

> Stanislav  (08.11.2006 08:46:11)  [11]

Опять же, попытка открытия набора при закрытом соединение

> ADOConnection1.Connected:=false;
> try
>   AdoDataset.Open;


Anatoly Podgoretsky   (2006-11-08 09:27:00) [20]

> Stanislav  (08.11.2006 09:05:12)  [12]


AdoDataSet1.Close;         <- зачем это
ADOConnection1.Connected:=false;
try
AdoDataset1.Open;       <- зачем это, может стоит все таки сначала открыть соендинение
except
AdoConnection1.Close;        <- и особенно зачем это, оно и так закрыто
ShowMessage('Сбой подключения')
end;


Это не код, а черт знает что, логика в нем отсутствует


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо