C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как программно проверить связь с сервером БД?  (Прочитано 11017 раз)
L.e.o.n.i.D
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 31

Я здесь, я там, я всегда!


« : 17 октября 2008, 12:51:17 »

Здравствуйте!

Может это немного и банальный вопрос, но все же перейду сразу к делу:

Требуется кусочек кода для проверки соединения с сервером БД (БД - MS SQL, соединение через BDE, компонент Builder'а - Database), т. е. как можно проверить есть ли связь с сервером и если ее нет, то выдать сообщение пользователю: либо нет сети, либо сервер занят, либо еще что-нить.

Как это все можно сделать программно?

Буду признателен всем, кто ответит... Заранее спасибо...
Записан
IT-IR
Участник
**

Сказали спасибо: +72/-22
Offline Offline

Сообщений: 877

Плата за вход-Разум!


« Ответ #1 : 17 октября 2008, 13:16:00 »

на работоспосбность не проверял но примерно так...(пишу по памяти)

Код:
try
{
     AnsiString ConnectionString;
     std::auto_ptr<TADOConnection> * con (new TADOConnection(this));
     ConnectionString = PromptDataSource(reinterpret_cast<unsigned int>(Handle), ConnectionString);
     con->ConnectionString = ConnectionString;
     con->Active = true;
}
catch(Exception &E)
{
     MessageBox( Handle
                     , ((AnsiString)"бла бла  бла\n\n"+excp.Message).c_str()
                     , Application->Title.c_str()
                     , MB_APPLMODAL + MB_ICONERROR + MB_OK);
}
Записан
L.e.o.n.i.D
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 31

Я здесь, я там, я всегда!


« Ответ #2 : 17 октября 2008, 14:19:49 »

Спасибо огромное!

Но тут речь идет об ADO, а я использую не ADO. Для связи с сервером я использую компонент Database.
Можно в принципе написать так:
Код:
try
 {
   Database->Connected = true;
 }
catch(...)
 {
   ShowMessage("Not connected !");
  }

Но этот кусочек ничего мне не дает... А хотелось бы действительно показать, что нет связи с сервером или нет сети... Как в этом случае сделать?
Записан
L.e.o.n.i.D
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 31

Я здесь, я там, я всегда!


« Ответ #3 : 17 октября 2008, 14:22:02 »

Можно еще пинговать сервер... Но как это делается программно, к сожалению, я не знаю...  Грустный
Записан
IT-IR
Участник
**

Сказали спасибо: +72/-22
Offline Offline

Сообщений: 877

Плата за вход-Разум!


« Ответ #4 : 17 октября 2008, 17:07:21 »

Код:
try
{
       Database->Connected = true;
}
catch(Exception &E)
{
     MessageBox( Handle
                     , ((AnsiString)"бла бла  бла\n\n"+excp.Message).c_str()
                     , Application->Title.c_str()
                     , MB_APPLMODAL + MB_ICONERROR + MB_OK);
}
а так разве не проканает??? разинцы не должно быть

пинговать программно... хм...
смотри ниже http://www.cyberguru.ru/cpp-sources/network/iskhodnik-pinga-ping.html

Записан
IVI_7777
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 3


« Ответ #5 : 17 октября 2008, 22:51:29 »

Здрасте!!! А зачем использовать для connecta DBE? Лучше использовать DLL. Наличие сервера проверяется функцией ping() 
Записан
L.e.o.n.i.D
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 31

Я здесь, я там, я всегда!


« Ответ #6 : 18 октября 2008, 11:40:23 »

Зачем использовать BDE?

1. Нет желания использовать ADO.
2. Плохое преподавание программирования по БД в универе.  Непонимающий

По поводу DLL. Можно по подробнее? Что именно за DLL???
Записан
L.e.o.n.i.D
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 31

Я здесь, я там, я всегда!


« Ответ #7 : 18 октября 2008, 11:44:31 »

IT-IR!

Ваш код в принципе проканывает. СПАСИБО! Но есть одно НО:

Я не хочу, чтобы юзер видел ошибки сервера, а лучше показать ему из-за чего именно программа не пашет...

Можно ли как-нить прописать в этом коде кучу ошибок и вытаскивать их оператором CASE?
Записан
L.e.o.n.i.D
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 31

Я здесь, я там, я всегда!


« Ответ #8 : 20 октября 2008, 08:05:16 »

И снова здравствуйте!

Помучившись еще 2 дня, нашел следующее решение для своей задачи (может кому интересно будет):

Код:
char *ip;
int er,po;
ip = "<вписываем IP>";
po = <порт, по которому идет соединение>;
er=tvain(ip,po);// функция проверки соединения
 switch (er)
{
case 1: // если соединение прошло успешно
{
try
{
fAuthorisation->ShowModal();// загружаю формочку авторизации
}
catch(...)
{
Application->MessageBox("Не удалось создать форму!","ОШИБКА...",MB_OK+MB_ICONERROR);
}
}; break;
case 2: ShowMessage("Not connected!"); break;// если не удалось соединиться
default: ShowMessage("Unknown Error!"); break;// иная неизвестная ошибка
}
Код:
/*ФУНКЦИЯ ПРОВЕРКИ СОЕДИНЕНИЯ*/

int tvain(char *ip_ad, int p)
 {
int res;
WSADATA WSAData;
SOCKET Client = INVALID_SOCKET;
SOCKADDR_IN rmTCP;
if (!WSAStartup(MAKEWORD(1,1), &WSAData))
{
res = 0;
Client = socket (AF_INET,SOCK_STREAM,0);
rmTCP.sin_family = AF_INET;
rmTCP.sin_addr.s_addr = inet_addr(ip_ad);
rmTCP.sin_port = htons (p);
if (connect (Client, (struct sockaddr *)&rmTCP,sizeof(rmTCP)) != 0)
{
Client = INVALID_SOCKET;
res = 2;
}
else
{
res = 1;
}
shutdown(Client,4);
WSACleanup();
}
else
{
res = 3;
};
return res;

Если понадобится, то не забудьте добавить следующее:

#include <stdio.h>
#include <winsock2.h>

Удачного компилирования!  Крутой
Записан
olegenty
Администратор
***

Сказали спасибо: +16/-7
Offline Offline

Сообщений: 520


« Ответ #9 : 20 октября 2008, 15:33:28 »

Наличие сервера с указанным IP в сети не значит, что на нём стартовал/не висит сервис СУБД. В результате пинги пройдут, а сервера-то и нет...
Записан
EpoxDe1u
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 85


« Ответ #10 : 18 ноября 2008, 01:04:13 »

Как функцией выше пингонуть Гугл ?  какой порт нужно указать ?
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг
**

Сказали спасибо: +350/-28
Offline Offline

Сообщений: 2181


« Ответ #11 : 18 ноября 2008, 16:23:43 »

Код:
ping /?
и
Код:
cmd /c ping google.com
Записан
L.e.o.n.i.D
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 31

Я здесь, я там, я всегда!


« Ответ #12 : 27 сентября 2009, 18:21:14 »

Наличие сервера с указанным IP в сети не значит, что на нём стартовал/не висит сервис СУБД. В результате пинги пройдут, а сервера-то и нет...

Вы правы! Но в данном случае коннект-то идет не только через IP-адрес, но и через номер порта на котором работает сервер. Для моей задачи этой проверки вполне достаточно, потому что наш админ фильтрует доступ к базе именно по этим параметрам.
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг
**

Сказали спасибо: +350/-28
Offline Offline

Сообщений: 2181


« Ответ #13 : 28 сентября 2009, 03:22:09 »

Код:
telnet host port
« Последнее редактирование: 28 сентября 2009, 06:36:35 от Tantos » Записан
L.e.o.n.i.D
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 31

Я здесь, я там, я всегда!


« Ответ #14 : 28 сентября 2009, 06:23:03 »

Код:
[b]telnet[/b] host port

Да, есть такое. Но я имел в виду как на C++Builder все это реализовать?!  Улыбка Мне бы кусочек кода...
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг
**

Сказали спасибо: +350/-28
Offline Offline

Сообщений: 2181


« Ответ #15 : 28 сентября 2009, 06:36:59 »

CreatePocess/ShellExecute + Named Pipes
Записан
L.e.o.n.i.D
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 31

Я здесь, я там, я всегда!


« Ответ #16 : 28 сентября 2009, 06:51:55 »

CreatePocess/ShellExecute + Named Pipes

Спасибо! Попробую!  Крутой
Записан
Gedeon
Ы
Администратор
***

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 291


« Ответ #17 : 04 ноября 2009, 11:48:13 »

Проще всего проверить связь выполнив какой-то простой запрос. Я предпочитаю спрашивать у сервера дату.
Записан
L.e.o.n.i.D
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 31

Я здесь, я там, я всегда!


« Ответ #18 : 04 ноября 2009, 11:51:15 »

Можно и дату проверить, но если нет сети, то запрос будет пытаться подключиться с серверу и это может немного затянуться...
Записан
Gedeon
Ы
Администратор
***

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 291


« Ответ #19 : 04 ноября 2009, 12:32:16 »

Ну если с сервером связи нет, то от того что что-то затянется разницы никакой).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: