Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: MySQL: проверка наличия связи с сервером, используя 'SELECT 1'.  (Прочитано 14779 раз)
0 Пользователей и 1 Гость смотрят эту тему.
malor
Опытный

ru
Offline Offline

« : 05-12-2011 13:30 » 


Запустил программу. При нажатии на кнопку осуществляется посыл команды
SELECT 1

1. Сервер MySQL работает. Нажимаю кнопку "Проверка связи". Выдает:
'Коннект присутствует!'.

2. Сервер MySQL останавливаю. Нажимаю кнопку "Проверка связи". Выдает:
'Нет соединения с сервером!'.

3. Сервер MySQL запускаю. Нажимаю кнопку "Проверка связи". Выдает:
'Нет соединения с сервером!'.

Почему на 3-м этапе неверное сообщение?

Код: (Delphi)
function TFormConnectMySQL.RunSQLQuery(SQLText : String; Silent: boolean = false): boolean;
begin

  try
    with ADOQueryCity do
    begin
      //Active := false;
      SQL.Clear;
      SQL.Add(SQLText);
      ExecSQL;
    end;
  except
     on e:Exception do
     begin
       Result := false;
       if (not Silent) then
         ShowMessage('Нет соединения с сервером!');

       Exit;
     end;
  end;

  Result := true;

end;

// Доступность сервера
function TFormConnectMySQL.ServerNotAvailable(Silent: boolean = false): boolean;
begin

  Result := false;

  if (not RunSQLQuery('SELECT 1', Silent)) then
    Result := true;

end;
procedure TFormConnectMySQL.btCheckConnectClick(Sender: TObject);
begin
  if (not ServerNotAvailable()) then
    ShowMessage('Коннект присутствует!');
end;

procedure TFormConnectMySQL.FormCreate(Sender: TObject);
begin

  ADOConnection1.ConnectionString:= 'Provider=MSDASQL.1;DSN=LTI;PWD=777';

end;

* ConnectMySQL.png (10.43 Кб - загружено 904 раз.)
« Последнее редактирование: 05-12-2011 13:32 от malor » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 05-12-2011 14:40 » 

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

В родном API MySQL есть функция mysql_ping - как раз для подобных случаев, чтобы проверить работоспособность подключения и автоматически восстановить если сервер отключился.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 05-12-2011 16:07 » 

ИМХО достаточно внутри блока исключения:
Код: (Delphi)
ADOConnection1.Active = True; // Вот здесь будет исключение, если нет связи
ADOConnection1.Active = False; // А это подготовка к следующей проверке.
// Можно и в обратном порядке ;)
Записан
malor
Опытный

ru
Offline Offline

« Ответ #3 : 06-12-2011 08:26 » 

ИМХО достаточно внутри блока исключения:
Код: (Delphi)
ADOConnection1.Active = True; // Вот здесь будет исключение, если нет связи
ADOConnection1.Active = False; // А это подготовка к следующей проверке.
Тогда это приведет к тому эффекту, что описан в топике
ADOConnection1.Connected := false - влияние на грид использующий TQuery
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 06-12-2011 12:18 » 

malor, у меня обратный вопрос: почему у тебя сервер скачет? Нормальный сервер - сама надежность. Или у тебя он на той же машине, что и приложение?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
malor
Опытный

ru
Offline Offline

« Ответ #5 : 06-12-2011 13:20 » 

Скачет? Я тестю реакцию программы на пропадание/появление сервака в области видимости.

Сейчас они на одной машине. Потом будут на разных.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 06-12-2011 13:52 » 

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

Отлов ошибки обычно выполняется через механизм исключений языка программирования. Специально делать какие-то тесты - дело сомнительное.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #7 : 10-12-2011 14:27 » 

ИМХО достаточно внутри блока исключения:
Код: (Delphi)
ADOConnection1.Active = True; // Вот здесь будет исключение, если нет связи
ADOConnection1.Active = False; // А это подготовка к следующей проверке.
Тогда это приведет к тому эффекту, что описан в топике
ADOConnection1.Connected := false - влияние на грид использующий TQuery

а вы не пробовали читать, то что я вам там написал? есс-но, будет обрыв коннекта и переоткрытие БД со всеми вытекающими.

чтобы "скрыть" от пользователя подобный эффект, можно сделать так:

Код: (Delphi)
ADODataset.DisableControls;
try
  ADOConnection1.Active = True; // Вот здесь будет исключение, если нет связи
  ADOConnection1.Active = False; // А это подготовка к следующей проверке.
finally
  ADODataset.EnableControls;
end;
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines