Форум: "Базы";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
ВнизСлучайный 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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.049 c