Форум: "Базы";
Текущий архив: 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.041 c