Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
569 / 169 / 22
Регистрация: 18.10.2012
Сообщений: 912

Обработать ошибку соединения с сервером MSSQL

30.06.2014, 17:47. Показов 2185. Ответов 7
Метки нет (Все метки)

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

Подключение идет таким образом
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TMessageNews::FormShow(TObject *Sender)
{
    DataModuleABS->ADOConnectionABS->ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;"
        "Persist Security Info=False;Initial Catalog=ER;Data Source=MICRO\\SQLEXPRESS;";
 
    DataModuleABS->ADOConnectionABS->Connected = true;
    DataModuleABS->ADOQueryABS->Active = true;
 
    Timer1->Enabled = true;
   Timer1->Interval = 10000;
 
}
Подскажите пожалуйста как можно обработать эту ошибку.
т.е что в итоге хотелось бы получить, если происходит разрыв с сервером, тогда не выдавать ни каких сообщений пользователю, а просто пытаться каждые 5 мин подключиться к серверу, ну и при успешном подключение просто продолжить работу программы в обычном режиме
Миниатюры
Обработать ошибку соединения с сервером MSSQL  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.06.2014, 17:47
Ответы с готовыми решениями:

Как правильно обработать ошибку "нет соединения с сервером БД"?
Периодически по разным причинам недоступен сервер баз данных. При попытке выполнить запрос появляется соответствущее сообщение. Хочется...

Как обработать ошибку соединения TClientSocket?
TClientSocket работает у меня асинхронно (т.е. ClientSocket1.ClientType:=ctNonBlocking). И при неудачном соединении...

Как правильно обработать ошибку соединения _ConnectionPtr Open
hr = pConnection->Open("Server=strconn, "", "", adConnectUnspecified); Знаю, что ошибка здесь, но в чем именно? Есть пример обработки...

7
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
01.07.2014, 02:45
К ADO я подключался вот так
C++
1
2
3
4
5
6
7
8
9
10
 try
     {
       ADOConnection1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+zxcv+"; Jet OLEDB:Database Password = AdminPC";
       ADOConnection1->Connected = true;
     }
      catch(Exception &e)
     {
       ShowMessage(e.Message);
       return;
     }
1
569 / 169 / 22
Регистрация: 18.10.2012
Сообщений: 912
01.07.2014, 08:45  [ТС]
Sasha, что то не получается ничего
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TMessageNews::FormShow(TObject *Sender)
{
try
{
    DataModuleABS->ADOConnectionABS->ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;"
    "Persist Security Info=False;Initial Catalog=ER;Data Source=MICROSOFT-PC\\SQLEXPRESS;";
    DataModuleABS->ADOConnectionABS->Connected = true;
    DataModuleABS->ADOQueryABS->Active = true;
    //  Timer1->Enabled = true;
    // Timer1->Interval = 10000;
    }
    catch(Exception &e)
    {
      ShowMessage(e.Message);
      return;
     }
}
, ошибка там же вылезает на ->Connected = true;

Как же можно сделать, в случае разрыва пытаться заново подключиться к серверу?
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
01.07.2014, 10:37
duh_si, так какой всё же Data Source? Везде указан разный...
ADOConnection, как правило, используется каким-нибудь адо датасетом. И его не обязательно открывать специально
C++
1
2
3
ADOQuery->Connection = DataModuleABS->ADOConnectionABS;
ADOQuery->SQL->Text = ....
ADOQuery->Open(); // Откроет ADOConnectionABS, если оно закрыто
Но, в любом случае, совершенно же необязательно выводить сообщение эксепшена. В во всех местах, где идёт попытка доступа к БД, проверять
C++
1
2
3
4
5
6
7
8
if( DataModuleABS->ADOConnectionABS->Connected )
{
  // Выполняем действия
}
else
{
  // Сообщаем об ошибке или ничего не делаем
}
Но лучше всего всё же как-то намекнуть ушастому, что доступа к серверу нет. Вывести сообщение в строку состояния "Нет доступа к серверу", задизейблить органы управления, чтобы пользователь зря не тыкал кнопочки. Словом, сделать так, чтобы по изменившемуся внешнему виду программы, пользователь понял, что "что-то не так"...
1
569 / 169 / 22
Регистрация: 18.10.2012
Сообщений: 912
01.07.2014, 13:53  [ТС]
Что-то совсем тупик, чего только уже не перепробовал

Подскажите а можно ли как то это ошибку в переменную запихать, а дальше я думаю можно будет поработать с этой переменной...
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
01.07.2014, 14:50
Можно и в переменную. Только зачем? Свойство Connected == false уже говорит о том, что подключения не произошло по каким-то причинам.
0
569 / 169 / 22
Регистрация: 18.10.2012
Сообщений: 912
01.07.2014, 15:37  [ТС]
Хорошо, c0rvax, давайте поэтапно попробуем разобраться
Запустилась программа:
C++
1
2
3
4
void __fastcall TMessageNews::FormShow(TObject *Sender)
{
TimerProverki->Enabled = true;
}
Проверяем соединение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TMessageNews::TimerProverkiTimer(TObject *Sender)
{
try
{
    DataModuleABS->ADOConnectionABS->ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;"
    "Persist Security Info=False;Initial Catalog=ER;Data Source=MICR\\SQLEXPRESS;";
 
    DataModuleABS->ADOConnectionABS->Connected = true;
    DataModuleABS->ADOQueryABS->Active = true;
    //DataModuleABS->ADOQueryMessage->Active = true;
    Timer1->Enabled = true;
    Timer1->Interval = 10000;
    }
    catch(...)
    {
    Sleep(10000);
      //ShowMessage("bla");
    }
    if (DataModuleABS->ADOConnectionABS->Connected) {
     TimerProverki->Enabled = false;
    }
}
Периодически просыпаемся, чтобы проверить появилось ли соединение, ну работает как будто как и надо, но это только при первом запуске программы..

Теперь ситуация, когда программа работала и сервер отвалился
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
void __fastcall TMessageNews::Timer1Timer(TObject *Sender)
{
            AnsiString ComputerName;  
  unsigned long Size = MAX_COMPUTERNAME_LENGTH + 1;
  wchar_t *Buffer = new wchar_t[Size];
  GetComputerName(Buffer, &Size);
  //ShowMessage(Buffer);
  ComputerName=Buffer;
  delete Buffer;
 
  if (DataModuleABS->ADOConnectionABS->Connected)
   {
            AnsiString ComputerNameNew;
  DataModuleABS->ADOQueryCompName->Active = true;
  DataModuleABS->ADOQueryCompName->Close();
  DataModuleABS->ADOQueryCompName->SQL->Clear();
  DataModuleABS->ADOQueryCompName->SQL->Add("Select CompName From dbo.Employee Where CompName = '"+ComputerName+"'");
  DataModuleABS->ADOQueryCompName->Open();
  ComputerNameNew = DataModuleABS->ADOQueryCompName->FieldByName("CompName")->AsString;
//далее еще код
    }
    else
    {
     TimerProverki->Enabled = true;
    }
}
Вот тут я проверяю if (DataModuleABS->ADOConnectionABS->Connected)
но код на проверку не обращает внимание и выдает опять ошибку на строке DataModuleABS->ADOQueryCompName->Open();

или все это дело тоже в try catch поместить?
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
01.07.2014, 16:15
Зачем Sleep( 10000 ) внутри таймера, который и так срабатывает раз в 10 сек? Установка DataModuleABS->ADOQueryCompName->Active = true; равносильна DataModuleABS->ADOQueryCompName->Open(). Зачем это делать? Особенно перед Close()?

Конечно, надо использовать try...catch, чтобы перехватить ошибку и включать таймер проверки внутри catch.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.07.2014, 16:15
Помогаю со студенческими работами здесь

Строка соединения с MSSQL
В общем не могу подключиться к MSSQL, проблема в строке соединения,не знаю почему. ADOConnection.ConnectionString := 'Provider =...

Ошибка соединения с сервером
Решил создать сайт на движке Wordpress, зарегистрировал домен и хостинг, выгрузил движок на сервер, и при заходе на сайт писало удалите...

Нет соединения с сервером
у меня следующая проблема. на моём компе клиент спокойно подключается и по локальному ip, и по интернет ip к серверу. всё работает, как...

Ошибка соединения с сервером
Добрый вечер. Подскажите, пожалуйста что за ошибка такая. ЗАГОЛОВОК: Соединение с сервером ------------------------------ Не...

Ошибки соединения c сервером
Проблема вот в чем, переодически пропадает соединение с mysql сервером, настроена односторонняя репликация, данный сервер slave. логи вот...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru