-
Есть проблема: работаю с удаленной базой данных, связь не стабильна, пробую проверить наличие соединения при помощи конструкции типа:
try
ADOConnection.Connected := True;
except
on E : Exception do
ShowMessage(E.ClassName+' '+E.Message);
но except не срабатывает, выскакивает сисемная ошибка. Подскажите почему. Или кто-нибудь знает другой способ проверки связи?
-
срабатывает.
запустите один exe - увидите
-
если бы срабатывало, я не стал бы задавать вопрос
-
Tools-DebuggerOptions-LanguageException
StopOnDelphiException
снять.
except не срабатывает?
-
для чистоты - новый проект начните
procedure TForm1.Button1Click(Sender: TObject);
begin
try
ADOConnection1.ConnectionString := 'йцукенгшщз';
ADOConnection1.Connected := True;
except
on E : Exception do
begin
ShowMessage(E.ClassName+' '+E.Message);
raise;
end;
end;
end;
-
> если бы срабатывало, я не стал бы задавать вопрос
скорее всего ошибка в другом месте
-
Есть версия, что CoInitialize не вызвал.
-
Похоже, что проблема возникла именно из-за ADOConnection. Системное сообщение об ошибке возникает еще до того, как Delphi перехватить исключение. Как это обойти, не знаю.
-
ADOConnection - создан динамически?
-
НИКАК НЕТ
-
Все просто.
Лежит оно на датамодуле, который создается во вторичном потоке.
CoInitialize не вызван + ШоуМессадж не из главного среда.
-
> Медвежонок Пятачок © (09.09.11 13:01) [10]
вероятнее всего.
"Но надо же понять что это за слово (с) День выборов"
> ZAlex
а так?
unit UnitXX
...
begin
CoInitializeEx(nil, 0);
end.
-
> Не могу перехватить исключение
больно слышать.
> а так?
чревато, ибо поток (раз допредполагались до них) все одно не тот. (или уже можно определять модуль в отдельный поток, оставляя написание как есть?)
-
>OW
Tools-DebuggerOptions-LanguageException
StopOnDelphiException
снять.
except не срабатывает!!
-
CoInitializeEx не срабатывает, ибо, похоже, обращение к ADOConnection открывает по любому свой поток (?). Неужели никто с подобной ситуацией не сталкивался?
-
CoInitializeEx не срабатывает
Это функция
-
Кроме того, не надо делать шоумессадж в обработчике исключения.
-
> CoInitializeEx не срабатывает, ибо, похоже
на что похоже это только из сообщения ошибки видно, а все что тут было в ветке все ТОЛЬКО предположения, т.к. реальной, достоверной инфы от тебя нет. даже то есть поток/нет потока ты не подтвердил, и зачем тогда CoInitialize ??? притом что его работа/не работа зависит от месторасположения. где у тебя тоже не понятно. можно также предположить с ним ты "ловишь рыбу там где ее нет, на катке например © анекдот"
-
> ADOConnection открывает по любому свой поток (?).
не по любому, а при только при асинхронном подключении.
> Неужели никто с подобной ситуацией не сталкивался?
с какой? у тебя твоя не описана. нам не известна.
то что ты считаешь, что все объяснил, информации не добавляет.
-
> ZAlex , если хочешь помощи - хватит партизанить и выкладывай, что и как ты делаешь.
Создаешь ли ты сам потоки, может у тебя консольная прога, или сервис - ты же не сообщил о программе ничего существенного.
-
Еще раз: есть удаленная база данных (удаленная в прямом смысле - до 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 прикрутите и дело с концом.
-
> Сервер может работать, а база нет.
Точно! Сама база в дауне, но коннект проходит. А вот select - уже нет.
-
> Inovet (13.09.2011 09:35:38) [38]
У него константа, псевдо база
-
> Ega23 © (12.09.11 12:04) [23]
> 2. Создать отдельный thread, в нём проделывать всё то же
> самое. в случае исключения послать мессадж основному потоку.
Олегыч, насколько я помню ADO принципиально не мултиаппартмент (уже забыл как точно называется). Незя ADOConnection юзать из другого потока. Работать будет (проверял), но это не правильно согласно модели потоков ADODB.
Видимо тебе надо добавить, что отдельный коннект всеже в потоке иметь. Это уже 2 коннекта. Видимо, не верно.
Видимо вообще надо не так - всю работу с БД выносить в отдельный поток. А твой контролирующий поток должен послылать датабазному потоку сообщения - проверь ка, жив ли коннектшион то?
Видимо так.
-
> Видимо вообще надо не так - всю работу с БД выносить в отдельный
> поток. А твой контролирующий поток должен послылать датабазному
> потоку сообщения - проверь ка, жив ли коннектшион то?
>
> Видимо так.
Ну можно и так.
-
Вставлю 5 копеек. Если проблема именно со связью, то проверять нужно именно связь (хоть пингом). Судя по тому, что коннект проходит, а селект - нет, то проблема не со связью, а с сервером. Хотя, могу и ошибаться.
-
> Судя по тому, что коннект проходит, а селект - нет, то проблема
> не со связью, а с сервером
Да что угодно может быть. Начина от Detach DataBase, заканчивая GRANT на данную учётную запись.