Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для DPS
43 / 41 / 20
Регистрация: 12.11.2011
Сообщений: 188
RAD XE4+

Timer - проверка подключения к БД ADOConnection

11.06.2019, 17:43. Показов 2490. Ответов 3

Студворк — интернет-сервис помощи студентам
Добрый день!
Прошу помочь)


На форме имеются:
  • ADOConnection
  • Panel
  • Timer
  • Memo

имеется БД, которую необходимо опрашивать с интервалом в 1 сек,- если база доступна, Panel подкрашивается в зеленый, при недоступности - в красный цвет. Дальше уже выполнять SQL-запрос.
Подскажите, это корректная проверка доступности\отображения состояния БД?
Еще один вопрос:
Таймер приостанавливает свое действие на момент выполнения функции? Интервал таймера 1000мс, при отсутствии подключения программа будет нормально себя вести ?)Экспериментальным путем пробовал несколько раз останавливать/запускать службу SQLServer, вроде бы ничего не висло,- интерфейс конечно, морозится, но потом развисает.
Что-то подсказывает, что это дилетантский подход) Или необходимо задействовать thread?
Тайминги на ADOConnection - commandtimeout и connectiontimeout = 1 (это, кстати, сек или мс?)


//запись логов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//---------------------------------------------------------------------------
const String LOG_FILE_NAME                  =   "Log_";
 
 
bool Log_File_Write(const String &str_for_write)
{
    try
    {
        TStringList *SL_Log     = new TStringList();
 
        try
        {
            String name_log_file    =   LOG_FILE_NAME   +
                                        Now().FormatString("yyyy_mm_dd")    +
                                        ".log";
 
            if(FileExists(name_log_file))
            {
                SL_Log->LoadFromFile(name_log_file);
            }
 
            SL_Log->Add(DateTimeToStr(Now())                + "\t" + str_for_write);
            Form3->Memo1->Lines->Add(DateTimeToStr(Now())   + "\t" + str_for_write);
 
            SL_Log->SaveToFile(name_log_file);
        }
        __finally
        {
            delete SL_Log;
        }
    }
    catch(...)
    {
        return false;
    }
 
    return true;
}
//---------------------------------------------------------------------------

//Функция запроса к БД:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//---------------------------------------------------------------------------
bool TForm3::Connection_with_Database()
{
    ADOConnection1->Connected   =   false;
 
    ADOConnection1->ConnectionString    =
    "Provider=SQLOLEDB.1;"
    "Password=Intellect_default_DB_4;Persist Security Info=True;User ID=sa;"
    "Initial Catalog=123456;Data Source="
    "SRV\\SQLEXPRESS2014";
 
    try
    {
        ADOConnection1->Connected   =   true;
    }
    catch(...)
    {
        ADOConnection1->Connected   =   false;
        return false;
    }
 
    return true;
}
//---------------------------------------------------------------------------
Сам таймер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//---------------------------------------------------------------------------
void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
    Log_File_Write("Таймер - начало");
 
    if(!Connection_with_Database())
    {
        Panel1->Color   =   clRed;
    }
    else
    {
        Panel1->Color   =   clGreen;
    }
 
    Log_File_Write("Таймер - конец");
}
//---------------------------------------------------------------------------
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.06.2019, 17:43
Ответы с готовыми решениями:

Изменение подключения ADOConnection програмно
Знающие люди, поскажите: Имеется объект ADOConnection (создан не программо, а через палитру компонент ADO). Соединение не установлено....

Изменить строку подключения у ADOConnection
Всем доброго время суток. Хочу программно изменить строку подключения ADOConnection. Вот мой код: with DataModule2.ADOConnection1 do ...

Проверка пути AdoConnection
Всем привет:) задача в следующем: соединяюсь с базой данных указывая путь в ADOConnection.connectionstring через OpenDialog, подскажите...

3
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
11.06.2019, 18:12
Цитата Сообщение от DPS Посмотреть сообщение
Подскажите, это корректная проверка доступности\отображения состояния БД?
По таймеру лучше не разрывать коннект, а посылать какоё-нибудь простой запрос, типа select 1.
В случае ошибки - закрывать. И при следующем таймере попытаться открыть
Что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ool TForm3::Connection_with_Database()
{
 
    try
    {
if (ADOConnection1->Connected)
    ADOConnection1->Execute("select 1");
else
{
    ADOConnection1->ConnectionString    =
    "Provider=SQLOLEDB.1;"
    "Password=Intellect_default_DB_4;Persist Security Info=True;User ID=sa;"
    "Initial Catalog=123456;Data Source="
    "SRV\\SQLEXPRESS2014";
   ADOConnection1->Connected   =   true;
}
   
 return true;
     
    }
    catch(...)
    {
        ADOConnection1->Connected   =   false;
        return false;
    }
 
   
}
1
 Аватар для DPS
43 / 41 / 20
Регистрация: 12.11.2011
Сообщений: 188
11.06.2019, 22:46  [ТС]
Спасибо)
Так в моем варианте нет необходимости использования потоков???
Мне непонятна ситуация:
интервал таймера 1000мс
каждую секунду он вызывает функцию соединения с БД. При доступности базы соединение выполняется очень быстро, а если база недоступна, проходит много времени, прежде чем выполняется проверка (т.е. > 1 сек). Так вот вопрос - таймер в таком случае "заморажвается" на некоторое время, пока вызываемая функция не завершится???
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
11.06.2019, 23:00
Цитата Сообщение от DPS Посмотреть сообщение
Так в моем варианте нет необходимости использования потоков???
Мне непонятна ситуация:
интервал таймера 1000мс
каждую секунду он вызывает функцию соединения с БД. При доступности базы соединение выполняется очень быстро, а если база недоступна, проходит много времени, прежде чем выполняется проверка (т.е. > 1 сек). Так вот вопрос - таймер в таком случае "заморажвается" на некоторое время, пока вызываемая функция не завершится???
Особой необходимости нет.
Да, замораживается, но на самом деле эти дисконнекты - довольно редкая штука. Здесь лучше, пока коннект есть проверять раз в секунду, когда нет - пореже.
Я обычно ещё перед тем как послать запрос отправлял "select 1" и , если он давал ошибку, переоткрывал коннект.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.06.2019, 23:00
Помогаю со студенческими работами здесь

Проверка имени пользователя в ADOConnection
Всем доброго времени суток. Смысл задачи - доступ к базе через ADOConnection определенным пользователям (по списку логинов). Нужно сделать...

ADOConnection, не пройдена проверка подлинности
имеется следующий код. база находится в папке с программой. procedure TForm1.FormCreate(Sender: TObject); begin ...

Проверка наличия подключенной БД, с помощью ADOConnection
Искал по интернету, нигде ничего толкового не нашел. Если кто знает, помогите Plz. БД подключена с помощью ADOConnection. Суть в том,...

Проверка подключения
У нас не очень хорошая связь и регулярно бывают сбои с подключением к Интернету, но странное дело: два компа на работе и дома, на обоих XP...

Проверка подключения к БД
Доброго времени суток! Подскажите пожалуйста, как возможно осуществить проверку подключения к БД в режиме реального времени? Поясню....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru