Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.09.2011, 07:23
ZAlex ZAlex вне форума
Прохожий
 
Регистрация: 17.03.2008
Сообщения: 5
Репутация: 12
По умолчанию Не могу перехватить исключение

Есть проблема: работаю с удаленной базой данных, связь не стабильна, пробую проверить наличие соединения при помощи конструкции типа:
try
ADOConnection.Connected := True;
except
on E : Exception do
ShowMessage(E.ClassName+' '+E.Message);
но except не срабатывает, выскакивает системная ошибка. Подскажите почему. Или кто-нибудь знает другой способ проверки связи?
Ответить с цитированием
  #2  
Старый 12.09.2011, 08:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,032
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от ZAlex
Есть проблема: работаю с удаленной базой данных, связь не стабильна, пробую проверить наличие соединения при помощи конструкции типа:

"А мужики-то и не знают" (с) реклама.
Тут ровно таже ситуация. Вообще, компонент не знает о том, что связь сломалась. Надо попробоавть выполнить любой запрос, который гарантированно пройдет в обычном случае и не будет при этом возврашять пол бызя, например
Код:
select count(1) from [любая_существующая_таблица] where 1=2
Ответить с цитированием
  #3  
Старый 12.09.2011, 08:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ZAlex, а если exe запустить отдельно, не из под Delphi?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 12.09.2011, 10:03
ZAlex ZAlex вне форума
Прохожий
 
Регистрация: 17.03.2008
Сообщения: 5
Репутация: 12
По умолчанию

NumLok, естесственно проверяется отдельный ехе
Ответить с цитированием
  #5  
Старый 12.09.2011, 12:09
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от ZAlex
Есть проблема: работаю с удаленной базой данных, связь не стабильна, пробую проверить наличие соединения при помощи конструкции типа:
try
ADOConnection.Connected := True;
except
on E : Exception do
ShowMessage(E.ClassName+' '+E.Message);
но except не срабатывает, выскакивает системная ошибка. Подскажите почему. Или кто-нибудь знает другой способ проверки связи?
Я работал не с ADO, но, возможно, ситуация аналогичная.
Во-первых, вопрос: в каком месте выскакивает системная ошибка?

Теперь опишу свой случай. После Connected:=true не факт, что, если связь не получилась, будет исключение (и какая-нибудь ошибка). Ошибка будет позже при проведении, например, запроса к базе, с которой нет связи.
Поэтому
1) exception бесполезен
2) после попытки связи (или перед любой операцией) делайте проверку: if Connected ...
Кстати, в Help'е так и сказано:
Код:
with ADOConnection1 do begin
  Open;
  if Connected then
    { connection successful }
  else
    { connection unsuccessful };

Последний раз редактировалось AlexSku, 12.09.2011 в 12:11.
Ответить с цитированием
  #6  
Старый 12.09.2011, 14:24
ZAlex ZAlex вне форума
Прохожий
 
Регистрация: 17.03.2008
Сообщения: 5
Репутация: 12
По умолчанию

AlexSku

Если не трудно, о каком Help вы говорите? Я бы с удовольствием посмотрел. А в вашем коде все равно при попытке выполнить if Connected при отсутствии связи будет возникать системная ошибка, которую я и пытаюсь перехватить.
Ответить с цитированием
  #7  
Старый 12.09.2011, 16:58
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от ZAlex
AlexSku

Если не трудно, о каком Help вы говорите? Я бы с удовольствием посмотрел. А в вашем коде все равно при попытке выполнить if Connected при отсутствии связи будет возникать системная ошибка, которую я и пытаюсь перехватить.
1) Кидаю на форму компонент:
ADOConnection1: TADOConnection;
Мышкой встаю на последнее слово и жму F1, открывается Help. Открываю окно Properties, в нём щёлкаю на Connected и - вуаля, пример, который я скопировал.

2) Вот как я делал:
Код:
  try
    IBDatabase1.Connected:= true;
  except
  end;

  if IBDatabase1.Connected then
  begin
Это я делал в событии OnTimer. Т.к. программа запускалась в автостарте, а InterBase не сразу был готов (только через пару минут).
Ответить с цитированием
  #8  
Старый 13.09.2011, 05:30
ZAlex ZAlex вне форума
Прохожий
 
Регистрация: 17.03.2008
Сообщения: 5
Репутация: 12
По умолчанию

Спасибо, коллеги, проблему кажется решил. Может по идее Connected и достаточно, но исключение перехватывается, толко если делаешь какой-нибудь простой select. Я поставил в try строку ADOQuery.Open и она вышла на обычный EOleException. Еще раз спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:27.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter