-
Еще раз: есть удаленная база данных (удаленная в прямом смысле - до 500 км), связь по выделенке, неустойчива. Мне нужно программно, скажем раз в 30 сек. проверять, есть ли у меня доступ к этой базе или нет, вот и все.
-
молодец. все прояснил. а то было сомнение дальше ли пятисот километров твоя база.
-
Вопрос:
нахрена при таком канале желать иметь постоянное соединение и проверять его раз в 30 секунд?
-
> Мне нужно программно, скажем раз в 30 сек. проверять, есть
> ли у меня доступ к этой базе или нет, вот и все.
1. Таймер, в таймере создать коннект, дёрнуть запрос "select 1". Если исключение - разбираться пристальнее.
2. Создать отдельный thread, в нём проделывать всё то же самое. в случае исключения послать мессадж основному потоку.
Вот и всё.
-
>Ega23
1. Таймер, в таймере создать коннект, дёрнуть запрос "select 1".
Так я именно так и пытаюсь. Но исключение не срабатывает, я же об этом и пишу!
А что касается на хрена или нет, то это реальная российская действительность - плохие каналы связи и задача, поставленная руководством, которую надо выполнить, а как, их не волнует.
-
и задача, поставленная руководством,
Они тебе так и сказали?
Возьми адоконекшен, таймер и делай актив раз в 30 секунд?
-
...а как, их не волнует.
Но это же не значит, что можно использовать любой дурацкий способ решения.
Верно?
-
> [24] ZAlex (12.09.11 14:16)
На Delphi 7 такого не встречал. На Delphi XE специально попробовал отключиться от сети - возникла обычная ошибка EOleException, которая нормально перехватывается.
Если ADO действительно генерирует исключение, которое сам же подавляет и выводит сам же окно с ошибкой, то это же недоработка и нужно сообщить в embarcodero. Если вы перепробовали все, что вам советовали на этом форуме (и уверены, что ошибка не перехватывается, она не в другом потоке, это не окно дебагера и т.д.) - пишите в техподдержку.
Какое окно с ошибкой вы получаете?
В самом крайнем случае можно перехватывать момент генерирования исключения. Для этого нужно написать свой SysUtils.RaiseExceptObject.
-
> ZAlex (12.09.2011 14:16:24) [24]
Раз не волнует, то выкати ценник на 100 мб канал.
-
> Но исключение не срабатывает, я же об этом и пишу!
У меня срабатывает, уже 5 с лишним лет. Что я делаю не так?
-
> Раз не волнует, то выкати ценник на 100 мб канал.
самый кстати правильный вариант...
> У меня срабатывает, уже 5 с лишним лет. Что я делаю не так?
так ты наверное на закрытом коннекте делаешь открытие... а он на уже открытом.
как у тебя любой дурак сможет... ;)
-
А почему дебилке ещë никто не сказал, что перед окончательной компиляцией программы нужно все соединения закрывать? Так и будете несуществующее потоки обсуждать..
-
> так ты наверное на закрытом коннекте делаешь открытие...
> а он на уже открытом.
На закрытом делаю открытие, дёргаю select 1, если всё норм - disconnect, если ошибка - обрабатываю.
А вот зачем select 1 дёргаю - не помню. Но что-то там такое было.
-
> Ega23 (12.09.2011 16:17:32) [32]
Наверно потому что это самый короткий запрос. Но работает не со всеми СУБД
-
> Но работает не со всеми СУБД
У нас исключительно MSSQL был, так что всё ОК.
> Наверно потому что это самый короткий запрос
Я вот и пытаюсь сообразить - нафига запрос нужен? по-идее достаточно Connected.
-
> Ega23 (12.09.2011 16:55:34) [34]
MS SQL отличная СУБД, с широкими возможностями.
-
Спасибо, коллеги, проблему кажется решил. Может по идее Connected и достаточно, но исключение перехватывается, толко если делаешь какой-нибудь простой select. Я поставил в try строку ADOQuery.Open и она вышла на обычный EOleException. Еще раз спасибо.
-
> ZAlex (13.09.2011 05:30:36) [36]
Так это же две разные процедуры, с разным соотношением.
Connected обеспечивает только подключение к серверу, а Open к таблице базы.
Сервер может работать, а база нет.
-
> [37] Anatoly Podgoretsky © (13.09.11 08:55)
> а Open к таблице базы
А, как у Ега, SELECT 1 к какой таблице? В некоторых базах специальные таблицы для таких целей есть.
-
А зачем "наружу" выстывлять базу? wcf прикрутите и дело с концом.