Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

Случайный disconect c СУБД   Найти похожие ветки 

 
RomanH ©   (2007-05-05 11:44) [0]

День добрый, господа. Использую копмоненты доступа к СУБД FireBird, FIBPlus. При запуске приложения появляется форма регистрации пользователя, если пользователь ввел правильный пароль,по событию onButtonClick вызывается хранимая процедура, которая записывает данные в лог, и продолжаем работать. Помогите отловить событие когда приложение падет, (случайно выключили питание, или еще какое-нибудь обстоятельство), чтобы я мог вызвать хранимую процедуру которая записала бы данные о том что пользователь прекратил работу с приложением. Если тема была помещена, не в тот раздел форума, я не против того чтобы ее переместили в раздел для начинающих, господа админы :).


 
atruhin ©   (2007-05-05 12:46) [1]

> (случайно выключили питание, или еще какое-нибудь обстоятельство)
> , чтобы я мог вызвать хранимую процедуру

И как ты будешь вызывать процедуру, если у компьютера выключили питание?


 
Johnmen ©   (2007-05-05 13:03) [2]


> RomanH ©   (05.05.07 11:44) 

Никак.


 
turbouser ©   (2007-05-05 13:24) [3]


> RomanH ©   (05.05.07 11:44)

"хранимая процедура" - имеется ввиду Stored Procedure FB ?
Тогда может помочь FB 2.1 - там есть глобальные триггеры на CONNECT и DISCONNECT.
Если лог ведется на клиенте, то у TpFIBDataBase есть
свойства BeforeDisconnect, AfterDisconnect.
Как работать с дисконнектами - есть примеры на http://www.devrace.com/


 
RomanH ©   (2007-05-05 13:42) [4]

BeforeDisconnect не работает,AfterDisconnect применять нет смысла.
Что же делать.


 
Sergey Masloff   (2007-05-05 14:01) [5]

turbouser ©   (05.05.07 13:24) [3]
>случайно выключили питание
ага очень поможет


 
turbouser ©   (2007-05-05 14:16) [6]


> Sergey Masloff   (05.05.07 14:01) [5]

Не стоит зацикливаться на питании :) Приложение по разным причинам
может получить дисконнект. Проблемы с сетью например.

> RomanH ©   (05.05.07 13:42) [4]

Попробуй все-таки FB 2.1


 
atruhin ©   (2007-05-05 15:06) [7]

> Попробуй все-таки FB 2.1

Не нужно его пробовать. Он только alpha версия, глюков полно.


 
RomanH ©   (2007-05-05 16:09) [8]

2 atruhin © . Если его не пробовать может существуют другия события, которые мне нужны. Уже 2 дня мучаюсь, перепробовал все возможные события.
2turbouser ©  Спасибо за совет, ну использовать Alpha версию Boss не разрешит

Мастера помогите, всегда направляли на правильный путь, ну на этот раз неужели нет никакого альтернативного решения.


 
turbouser ©   (2007-05-05 16:52) [9]


> RomanH ©   (05.05.07 16:09) [8]

Альтернатива - добавить еще одно звено между клиентом и FB, которое
будет отвечать за ведение лога коннектов.


 
Johnmen ©   (2007-05-05 17:51) [10]


> turbouser ©   (05.05.07 16:52) [9]
> Альтернатива - добавить
> еще одно звено между клиентом и FB, котороебудет отвечать
> за ведение лога коннектов.

Каким образом оно будет отвечать?
И как это коррелирует с сабжем?


 
turbouser ©   (2007-05-05 18:29) [11]


> Johnmen ©   (05.05.07 17:51) [10]
> Каким образом оно будет отвечать?

Как сделать - так и будет отвечать. Соорудить например сервис, который
будет выполнять редирект трафика с определенного порта на порт FB,
отслеживать активность соединения и писАть что надо в лог/выполнять ХП/что-то еще делать.
Естественно, клиентский софт должен подключаться к этому сервису.
(Можно и по другому, но, имхо так надежнее :)
Можно взять что-то готовое (zebedee к примеру) и добавить нужную
функциональность.

> И как это коррелирует с сабжем?

Автору надо выполнять хп при соединении/отсоединении.


 
Johnmen ©   (2007-05-05 18:48) [12]


> turbouser ©   (05.05.07 18:29) [11]
>> И как это коррелирует с сабжем?
>Автору надо выполнять хп при соединении/отсоединении.

И как это коррелирует с выполнением хп?

ЗЫ
А написать ещё кучу программ, которые будут и 2*2 считать и удои молока в Воронежской области, труда не представляет, и, главное, поможет....:)))


 
PEAKTOP ©   (2007-05-05 21:33) [13]

да никак ты не отловишь дисконнект.
Единственный выход - ловить коннект. То бишь, по таймеру, например, че-то пишем в базу. Если по таймеру это не происходит, то выполняем указанные тобой действия.
Хотя, Johnmen меня за этот совет побъет :)))) И, самое противное, я знаю почему.


 
DrPass ©   (2007-05-05 22:00) [14]


> да никак ты не отловишь дисконнект

Ну, не то чтобы совсем никак. Через анус все можно сделать. На ibase.ru есть утилитка ibconsvc с исходниками. Ее суть - сидеть на сервере и мониторить порт 3050, регистрируя подключения и отключения клиентов. Вот по тому же принципу можно повесить сервис, который будет ловит "отваливание" клиента от порта и делать нужные изменения в базе данных


 
sniknik ©   (2007-05-05 22:40) [15]

если поменять постановку вопроса с того как делается на зачем делается, то невозможное становится возможным...

предполагаю что делается чтото вроде мониторинга активных юзеров, типа как в 1С, есть там пункт меню нажав на который можно узнать кто подключен к базе в данный момент.
если так то это легко, не надо ловить отсоединение/выключение компа, надо подтверждать присутствие...
т.е. к примеру программа записывает в файл активных юзеров запись о себе если ее нет, и обновляет в ней время присутствия, каждую минуту например, если она уже есть. и все, если программа нормально завершается запись можно удалять, нет так и нет. а для мониторинга читать юзеров из таблички со временем обновления не более 2 мин назад. -> цель достигнута. (заодно и "бонус", можно узнать кто "отвалился" без нормального завершения)
1С кстати примерно так и делает, можно проверить, оборвать коннект с какойто машиной, а на другой мониторить пользователей, отвалится "оборванный" не сразу, только после какогото таймаута.

и никаких сервисов, или других усложнений. (если конечно я прав в чем задача, в вопросе ее нет, там неверный путь решения чегото тайного...)


 
Johnmen ©   (2007-05-06 00:09) [16]


> PEAKTOP ©   (05.05.07 21:33) [13]
> sniknik ©   (05.05.07 22:40) [15]

Не, ну конечно мониторить постоянно это не самый тяжкий криминал :)
Да вот вопрос-то в том, кто, когда и где будет мониторить, как будет "воздействовать" на сервер.
И заради чего всё это??? Особенно в свете "случайного выключения питания" :)))


 
sniknik ©   (2007-05-06 01:15) [17]

> Не, ну конечно мониторить постоянно это не самый тяжкий криминал :)
зачем постоянно? только когда нажали на кнопку "показать активных юзеров", а вот присутствие подтверждать... вот это придется постоянно с какимто интервалом. (ну да, посылка запроса на обновление одной записи не больший "грех" чем предлагаемые варианты сканирований сети)

> Да вот вопрос-то в том, кто, когда и где будет мониторить, как будет "воздействовать" на сервер.
и то и другое (подтверждение/чтение активных юзеров) делают клиенты по идее, сервер на то и сервер чтобы обрабатывать запросы клиентов. нечего на него контроль за ними возлагать.

> И заради чего всё это??? Особенно в свете "случайного выключения питания" :)))
может ты не заметил, но я изменил условие вопроса прежде чем предлагать свое решение. а в свете "случайного выключения питания" выполнять чтото на выключенной машине.... ??? ну я как бы и не предлагал.

1С есть? пункт меню "сервис"->"монитор пользователей"->"активные пользователи"
нажми. вот это я предлагал. но только в том случае если [0] попытка сделать подобное, если его "событие на выключение питания" есть попытка "в лоб" - включили пишем, выключается удаляем, решить подобное.
а "за ради чего" это... ну не знаю, в 1С сделали, наверно посчитали нужным. почему другим не нужно?


 
Johnmen ©   (2007-05-06 01:40) [18]


> и то и другое (подтверждение/чтение активных юзеров) делают
> клиенты по идее, сервер на то и сервер чтобы обрабатывать
> запросы клиентов. нечего на него контроль за ними возлагать.

Клиент же упал! А ХП сервер выполняет.
Или ты предлагаешь перейти на обсуждение совершенно иного вопроса, вместо как обсуждать зачем? Так это неинтересно...


 
Johnmen ©   (2007-05-06 01:42) [19]

Впрочем, и как тоже неинтересно...
Ибо глупости это, барин (с)


 
sniknik ©   (2007-05-06 01:57) [20]

> вместо как обсуждать зачем?
именно. потому как зачем делается считаю основной задачей, а как делается одним из неправильных путей решения.

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

если угадал замечательно, нет... ну не оченьто и хотелось. но может ктото прочитает и поймет насколько важна постановка вопроса (от категоричного нельзя до легко, зависящим от небольшой коректировки), и станет описывать и что делается и зачем, а уж как делать будет спрашивать. а не наоборот. (хотя верится в это с трудом :)


 
Германн ©   (2007-05-06 02:04) [21]

Да. :(
Читая сей топик понял, что похоже второй пункт из просьб "начальника" приведёт меня к геморрою :(
http://delphimaster.net/view/3-1178140671/


 
Megabyte ©   (2007-05-07 11:38) [22]

Дабы не плодить тему. Есть программа, которая делает действия по таймеру: показывает данные на диаграмме, обновляясь раз в 10мин.
Бывает так, что проблемы с сетью. Соответствено программа при очередном обновлении выдает ошибку и зависает. Требуется, чтобы программа, если не получилось обновиться, просто попробовала сделать это на следующей итерации Таймера.
"Обрыв" соединения вроде как отлавливаю в компоненте TpFIBDatabase в событии OnLostConnect.
Только непонятны дальнейшие действия. Если в обработчике события пытаюсь провести какие-то действия(допустим, временное отключение компонентов соединения от БД), а потом имитирую отключение от сети(кабель вытаскиваю), то программа просто закрывается. Если запускать из под отладчика, то выдает ошибку "EStackOverflow".
Честно говоря, мне не понятно, почему это происходит.
Код в обработчике события простейший:
procedure Tfrm_main.fdb_viewLostConnect(Database: TFIBDatabase;
 E: EFIBError; var Actions: TOnLostConnectActions);
begin
 frm_main.fdb_view.Close; //закрытие коннекта к компоненте
end;

Кто-нибудь что подскажет. Почему так происходит и как решить задачу.


 
atruhin ©   (2007-05-07 15:28) [23]

> то программа просто закрывается.

Значит где то "глушишь" исключение, т.е. пустой Except end;

> Код в обработчике события простейший:

Зачем что то закрывать, оно уже закрыто. Вообще эти ситуации хорошо описаны в книжке "Мир интербэйс"
В сети есть в электронном видее.


 
Megabyte ©   (2007-05-07 17:38) [24]


>atruhin ©  (07.05.07 15:28) [23]

> то программа просто закрывается.

1)Значит где то "глушишь" исключение, т.е. пустой Except end;

> Код в обработчике события простейший:

2)Зачем что то закрывать, оно уже закрыто. Вообще эти ситуации хорошо описаны в книжке "Мир интербэйс"
В сети есть в электронном видее.

1) Нет, это не так.
2) Забей, любая команда. Такое ощущение, что событие(OnLostConnect) возникает постоянно и получается какое-то переполнение стека. В обычном режиме программа просто закрывается, в отладчике показывает соответствующую ошибку.

з.ы. Я понимаю, что малоинформативно, но больше добавить нечего :(



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

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.027 c
2-1186487935
GhosTer
2007-08-07 15:58
2007.09.02
Запуск от администратора


2-1186511541
;peg
2007-08-07 22:32
2007.09.02
TWebBrowser и Memo


15-1186501950
Quazi
2007-08-07 19:52
2007.09.02
Алгоритм расчета DataMatrix


15-1186219330
GROM2007-92
2007-08-04 13:22
2007.09.02
Как работать?


4-1173459354
ы
2007-03-09 19:55
2007.09.02
процессор