Array
(
)

Verificar se Banco de Dados esta online antes de conectar

Paulo Barros.
   - 20 nov 2009

Crie uma aplicação que gravar o dados em formato xml
para posterio envio ao banco da dados firebird.
o problema é o seguinte que verificar se o banco esta on-line antes de tentar enviar.
como posso fazer

ja tentei

try
 scConn.open //SQLConnection
except
 showmessage('Servidor off-line');
 exit;
end;

a aplicação travar 

Martins
   - 26 nov 2009

Verificando com IF não lhe serveria?

Tente assim:

  if SQLCon1.ConnectionState = csStateOpen then
    ShowMessage('Conectado!')
  else
    ShowMessage('Não conectado!!')

Boa sorte e bons códigos!

Paulo Barros.
   - 26 nov 2009

Valeu pela dica mais isto ai eu sei fazer.

Não estou querendo teste se o componente esta conectado não.   O se o servidor está disponivel, por exemplo, acontece alguma coisa com o servidor e ele é desligado. Então a aplicação cliente daria pau porque o servidor não esta disponivel, então criei uma rotina pra gravar os dados em outro lugar até servidor do bd ficar disponivel. por isso tenho que saber quando ele esta desligado para não travar a maquina cliente. Entendeu.

Adriano Silva
   - 27 nov 2009


Bom dia,

Pelo que eu entendi você quer saber se o server está no ar, é isso?
Caso seja isso o mais fácil é você dar um ping no servidor pelo IP (se for fixo) ou pelo host (se for dinâmico).

Abaixo segue a função:

function Ping: Boolean;
var
  wsadt: wsadata;
  HNDicmp: integer;
  hndFile: integer;
  Host: PHostEnt;
  Destino: in_addr;
  Retorno: integer;
  ipHost: string;
  IcmpCreateFile: function():integer; {$IFDEF WIN32} stdcall; {$ENDIF}
  IcmpCloseHandle: procedure(var handle:integer);{$IFDEF WIN32} stdcall; {$ENDIF}
  IcmpSendEcho: function(var handle:integer; endereco:DWORD; buffer:variant; tam:WORD; IP:IPINFO; ICMP:ICMPECHO; tamicmp:DWORD; tempo:DWORD):DWORD;{$IFDEF WIN32} stdcall; {$ENDIF}
begin
  Result := False;
  //coloca o ip do servidor
  ipHost := '192.168.0.1';
  HNDicmp := LoadLibrary('ICMP.DLL');
  if (HNDicmp <> 0) then
  begin
    @IcmpCreateFile := GetProcAddress(HNDicmp,'IcmpCreateFile');
    @IcmpCloseHandle := GetProcAddress(HNDicmp,'IcmpCloseHandle');
    @IcmpSendEcho := GetProcAddress(HNDicmp,'IcmpSendEcho');
    if (@IcmpCreateFile=nil) or (@IcmpCloseHandle=nil) or (@IcmpSendEcho=nil) then
    begin
      FreeLibrary(HNDicmp);
    end;
  end;
  Retorno := WSAStartup($0101,wsadt);
  if (Retorno <> 0) then
  begin
    WSACleanup();
    FreeLibrary(HNDicmp);
  end
  else
    begin
      Destino.S_addr := inet_addr(Pchar(ipHost));
      if (Destino.S_addr = 0) then
        Host := GetHostbyName(PChar(ipHost))
      else
        Host := GetHostbyAddr(@Destino,sizeof(in_addr), AF_INET);
      Result := not (host = nil);
    end;
  FreeLibrary(HNDicmp);
  WSACleanup();
end;

Eu uso essa função em um de meus sistemas para efetuar o ping.

Abraço...

Fernando
   - 08 dez 2009

  Amigo, acho que seria interessante criar uma procedure e nesta, vc poderia colocar um tratamento na hora que vc for fazer o commit, nessa hora, vc verifica se tudo ta ligado (online), se nao tiver, vc tenta reconectar até tudo se normalizar.
  Acho que seria complicado vc salvar em outro local e depois salvar no banco. Isso envolve muitas outras coisas... A não ser que o projeto tenha sido preparado para isso ou que vc está planejando isso desde o inicio.

Fernando Medeiros
http://fernandomedeiros.com.br/blog

Martins
   - 10 dez 2009

Desculpe pela dica anterior, não havia entendido a sua necessidade. Dando continuidade...

Tente trabalhar com ClientSocket, acho que o uso desse componente pode lhe ajudar já q vc quer saber o status do servidor, on/off, vc poderia tentar obter uma resposta pelo IP e Porta utilizada por exemplo por seu SGBD.

Boa sorte e bons códigos.