Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Вниз

решение проблемы обрыва коннекта в IBX   Найти похожие ветки 

 
GanibalLector ©   (2004-10-20 14:13) [0]

В очередной раз разбираюсь с обрывом коннекта в IBX.Все сделал по статье
http://www.ibase.ru/devinfo/ibx_connect.txt
Автор там пишет

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


Но,почему-то TDatabase у меня не отключается(св-во Connected=true) при обрыве.
Транзакции и датасеты закрыты,тут согласен.
Более того,Connection lost! ко мне не доходит,а ведь там есть :


if FLostConnection then          // все-таки надо что-то сообщить
raise Exception.Create("Connection lost!");  // ivan_ra


Приходит сообщение:
Unable to complete network request to host "имя компьютера"
Error writing data to the connection.
Удаленный хост принудительно разорвал существующее подключение


Ну,а если после этого закрыть программу то,получаю :
обнаружена ошибка.Приложение будет закрыто... несколько раз.

Какие будут предложения ???

З.Ы. Самое главное.Преследую цель поймать Exception с текстом Connection lost! и НОРМАЛЬНО закрыть свою программу,предварительно
сообщив пользователю,что связь с сервером прервана .


 
GanibalLector ©   (2004-10-20 18:35) [1]

Что,никто не доскажет ???


 
GanibalLector ©   (2004-10-23 00:41) [2]

Вопрос еще в силе!


 
Sergey_Masloff   (2004-10-23 01:44) [3]

GanibalLector ©   (20.10.04 14:13)  
Когда статьи читаешь - совет обращать внимания на даты написания и версии компонент. А то так и будешь бороться сомнительными методами с давно пофиксеными ошибками. Исключение о потере коннекта совершенно нормально ловится в текущей версии IBX.  
 Кстати многократное сообщение об ошибке при закрытии приложения... Похоже на порушеный стек. Версия компонент - в студию!


 
GanibalLector ©   (2004-10-23 02:05) [4]

2 Sergey_Masloff  
Версия 5.04.


 
Sergey_Masloff   (2004-10-23 09:28) [5]

GanibalLector ©   (23.10.04 02:05) [4]
>Версия 5.04.
Это очень старая. Я в D5 с IBX давно не сталкивался но должно быть посвежее? У меня в D7 сейчас 7.08 вроде бы баг с разрушением стека пофиксили в x.06 была ли она для D5 честно говоря не помню но отчетливо помню что проблема была закрыта. Вобщем завтра попробую пример с D5 набросать который ловит исключение обрыва коннекта. Сегодня по времени никак


 
GanibalLector ©   (2004-10-23 12:01) [6]

> Вобщем завтра попробую пример с D5 набросать который ловит исключение обрыва коннекта.

Был бы очень признателен.Жду...
Если он большой получиться,то mailto : Talla2k@ukr.net


 
jack128 ©   (2004-10-23 17:21) [7]

Ничего не понимаю.  Кто нить может мне объяснить как Джефф нумерует свои версии???

вот цитата из одного редми
For all IBX updates the
major number will correspond with the Delphi version
and the minor version will indicate the fix level that
should be relatively the same across versions
(there will always be some exceptions depending
on the relative compatibility in general across versions).
so IBX 5.02 is for Delphi 5 at the .02 level.

Но видимо теперь нумерация изменилась, потому что на http://info.borland.com/devsupport/interbase/ibx_updates.html  говориться о 4.52 .. Ну не для четверки же этот апдейт???


 
GanibalLector ©   (2004-10-24 17:30) [8]

Видать Sergey_Masloff   забыл про [5]...Жаль,очень жаль.
Что делать-то ???


 
jack128 ©   (2004-10-24 18:14) [9]

а чего трассировка кода то говорит?? Почему не подымается это исключение??
if FLostConnection then raise Exception.Create("Connection lost!");  // ivan_ra


 
GanibalLector ©   (2004-10-24 22:19) [10]

2 jack128 ©   [9]
Хм...не понял о чем речь.
З.Ы. Я ж не волшебник,я только учусь...


 
jack128 ©   (2004-10-24 22:31) [11]

GanibalLector ©   (24.10.04 22:19) [10]
что такое отладчик - имеешь представление??


 
Карелин Артем ©   (2004-10-25 12:10) [12]

И чего ради эта статья висит на сайте так долго?
И как можно 1 в 1 выполнить что там пишется??? Не понимаю :((((
Читаем:
1) а) Добавляем флаг, предотвращающий зацикливание (во всех версиях библиотеки):
 TIBDataBase = class(TCustomConnection)
 private
   ...
   FAlreadyForce:boolean;     // ivan_ra
   ...
б) не забываем о его инициализации:

А где собственно флаг устанавливается в true?
2) в) правим место, где происходило зацикливание:
procedure TIBDatabase.InternalClose(Force: Boolean);
var
 i: Integer;
 FConnectionLost:boolean;     // ivan_ra
begin
 FLostConnection:=CheckStatusVector([isc_lost_db_connection]);  // ivan_ra
...
 FAlreadyForce:=false;        // ivan_ra
 if FLostConnection then          // все-таки надо что-то сообщить пользователю
   raise Exception.Create("Connection lost!");  // ivan_ra

Обьявили одно, пишем другое. Непонятно...
3) Теперь, при обрыве связи TDatabase будет автоматически отключаться, хендлы
всех транзакций будут очищены, датасеты нормально закрыты. Можно пытаться
восстановить соединение, либо спокойно закрывать программу.


 
GanibalLector ©   (2004-10-25 19:24) [13]

2 Карелин Артем ©
1)Сам удивлен этому явлению
2)Ну там как бы понятно,что надо везде FLostConnection
3)Имелось ввиду TIBDataBase
Вероятно автор был в нетрезвом состоянии :)

Кстати,а как,собственно,создать IbDatabase.DCU???
Пробовал так :
Открыл IbDatabase.pas (Source\VCL)  изменил,сохранил,откомпилировал.И что же я вижу:  IbDatabase.pas изменился,а   IbDatabase.dcu(Lib &Lib\Debug) не изменился.
Пробовал удалить IbDatabase.dcu и откомпилировать IbDatabase.pas,но dcu не появился.

Если IbDatabase.pas кинуть к своему любому проекту,то ВО-ПЕРВЫХ он потребует толпу pas(ib,ibsql и пр.),а во вторых Delphi после этого начинает вылетать...все время висит хинт,что мол версии разные.


 
GanibalLector ©   (2004-10-25 19:59) [14]

Усугубляет то,что связаться с ivan_ra невозможно!!! E-mail уже не существует и в ICQ такого ника тоже нет...
Вот это засада...


 
jack128 ©   (2004-10-25 21:40) [15]

GanibalLector ©   (25.10.04 19:59) [14]
попробуй вопрос на news:\\epsylon.public.interbase


 
jack128 ©   (2004-10-25 21:40) [16]

задать...


 
Sergey_Masloff   (2004-10-25 22:15) [17]

Блин, посмотрел - действительно в D5 та же ерунда. Перехватить сообщение в Application.OnException() конечно без проблем получается но при этом все равно некорректно все закрывается. Нет времени ковырять может завтра еще посмотрю...


 
GanibalLector ©   (2004-10-26 02:23) [18]

>а чего трассировка кода то говорит?? Почему не подымается это исключение??

В этом коде :

procedure TIBDatabase.InternalClose(Force: Boolean);
var
 i: Integer;
 oldHandle : TISC_DB_HANDLE;
  FLostConnection:boolean;
begin
 CheckActive;
 if FAlreadyForce then Exit;  // ivan_ra
 FAlreadyForce:=Force;        // ivan_ra
 FLostConnection:=CheckStatusVector([isc_lost_db_connection]);  // ivan_ra

 { If we are being forced close this is normally an abnormal connection loss.
   The underlying datasets will need to know that connection is not active
   the underlying objects are told the connection is going away }
 if Force then
 begin
   oldHandle := FHandle;
   FHandle := nil;
 end
 else
   oldHandle := nil;

for i := 0 to FSQLObjects.Count - 1 do
 begin
   try
     if FSQLObjects[i] <> nil then
       SQLObjects[i].DoBeforeDatabaseDisconnect;

   except
     if not Force then
       raise;
   end;
end;
...
 FAlreadyForce:=false;        // ivan_ra
 if FLostConnection then          // все-таки надо что-то сообщить пользователю
   raise Exception.Create("Connection lost!");  // ivan_ra

Выделенным показано где происходит ступор!!! До места где ivan_ra поднял исключение код не доходит.В выделенном exception не возникает.

А ошибку получаю здесь :
function TIBDatabase.Call(ErrCode: ISC_STATUS;
 RaiseError: Boolean): ISC_STATUS;
begin
 result := ErrCode;
 FCanTimeout := False;
 {Handle when the Error is due to a Database disconnect.  Call the
 OnConnectionLost if it exists.}
 if  CheckStatusVector([isc_lost_db_connection]) then
   ForceClose;
 if RaiseError and (ErrCode > 0) then
   IBDataBaseError;
end;


Т.е. если долго лазить по  SQLObjects[i].DoBeforeDatabaseDisconnect;  то она как-раз и входит в  TIBDatabase.Call где и происходит  IBDataBaseError

К сожалению ни о каких raise Exception.Create("Connection lost!"); говорить пока не приходится


 
GanibalLector ©   (2004-10-26 02:25) [19]

Вернее так :
Если долго лазить по f7 на ф-ции SQLObjects[i].DoBeforeDatabaseDisconnect   то она как-раз и входит в  TIBDatabase.Call где и происходит  IBDataBaseError


 
GanibalLector ©   (2004-10-26 11:42) [20]

Удалил часть кода из TIBDatabase.InternalClose,а именно

{ for i := 0 to FSQLObjects.Count - 1 do
 begin
   try
     if FSQLObjects[i] <> nil then
       SQLObjects[i].DoBeforeDatabaseDisconnect;
   except
     if not Force then
       raise;
   end;
 end;        }



Теперь НАКОНЕЦ-ТО возникает  raise Exception.Create("Connection lost!") ,но
толку-то ??? При закрытии программы опять таки "Программа выполнила ... и будет закрыта"

Кстати,при закрытии появляется Exception EIBClientError с сообщением "DataSet Open"
пробовал программно закрыть все DataSet(когда появляется первый Exception.Create("Connection lost!")) не помогло...


 
jack128 ©   (2004-10-26 12:29) [21]

GanibalLector ©   (26.10.04 2:25) [19]
Если долго лазить по f7 на ф-ции SQLObjects[i].DoBeforeDatabaseDisconnect   то она как-раз и входит в  TIBDatabase.Call где и происходит  IBDataBaseError

Ну и фиг с ней, с этой ошибкой.. Главное, чтобы внутрение флаги об установленном коннекте/открытых транзакциях и запрросах сбросились..Попробуй для начала подавить эти исключения..

for i := 0 to FSQLObjects.Count - 1 do
begin
  try
    if FSQLObjects[i] <> nil then
      SQLObjects[i].DoBeforeDatabaseDisconnect;
  except
    if not (Force or FLostConnection) then
      raise;
  end;
end

мало реально, чтобы это заработало, но вдруг..По хорошему, те нужно пройтись по всему коду, который выполняется при КОРЕКТНОМ закрытии коннекта и посмотреть какие флаги сбрасываются(я так понимаю handle"ы конекта и тд) и подправить код так, чтобы эти флаги/хендлы обнулялись..


 
jack128 ©   (2004-10-26 12:30) [22]

GanibalLector ©   (26.10.04 11:42) [20]
Удалил часть кода из TIBDatabase.InternalClose,а именно


это оригинальное решение, конечно ;-) Теперь у тя при каждом дисконекте будет утечка ресурсов..


 
GanibalLector ©   (2004-10-27 00:13) [23]

>Ну и фиг с ней, с этой ошибкой.. Главное, чтобы внутрение флаги об установленном коннекте/открытых транзакциях и запрросах сбросились..

Дык,в том-то и дело,что если не сбрасываются ...
Видать нужно следовать [5] ставить D7 и соответствующий IBX...
З.Ы. Печально все это...Я так привык к D5 :(


 
jack128 ©   (2004-10-27 00:44) [24]

GanibalLector ©   (27.10.04 0:13) [23]
Дык,в том-то и дело,что если не сбрасываются ...


Хе, ну так по твоему они сами собой должны сброситься? ;-) Исследование чужих исходников - дело архиполезное, так что дебагер в руги - и вперед. Если есть время конечно. Покрайней мере я очень люблю в исходниках VCL ковыряться.


 
GanibalLector ©   (2004-10-27 02:12) [25]

Все получилось!!! Всем спасибо!!!

З.Ы. Я счастлив как никогда :)))


 
Карелин Артем ©   (2004-10-28 13:16) [26]

GanibalLector ©   (27.10.04 02:12) [25]
Если у тебя в Д5 получилось, колись что сделал. Мне тоже надо решить эту проблему.



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

Форум: "Базы";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.035 c
4-1097591214
#Мастер#
2004-10-12 18:26
2004.11.28
Инфа о компе


14-1099683570
Piter
2004-11-05 22:39
2004.11.28
Непонятна работа GetWindowText


3-1099464821
Iova
2004-11-03 09:53
2004.11.28
Как определить тип поля?


4-1092111253
Stype
2004-08-10 08:14
2004.11.28
Программа общения с COM портом


10-1066373733
Erik
2003-10-17 10:55
2004.11.28
Управление транзакциями в трех звенке.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский