Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   reconectar Firebird cuando se pierde la conexion de red!!! (https://www.clubdelphi.com/foros/showthread.php?t=54828)

CarlosHernandez 01-04-2008 01:09:06

reconectar Firebird cuando se pierde la conexion de red!!!
 
buenas a todos los foristas.

uso firebird 2.0 delphi 6 con los componentes de interbase, el problemas es que tengo mi base de datos en el servidor y desde otra maquina tengo abierta mi aplicacion, aveces la señal de la red se cae pero se reestablece la conexion de la red inalambrica en cuestion de segundos, pero cuando voy a usar mi aplicacion me da un mensaje de error que dice que no se hay conexion on el host remoto y no se conecta.

como hago para detectar esta falla de conexion y cuando la consiga hacer un codigo para que se conecte automaticamente y evitar este error ya que no se como hacerlo.

estuve buscando en todos los hilos y no vi algo que me ayudra, solo vi al go de reconectar aldo pero no me ayudo mucho. gracias.

Rockin 01-04-2008 19:05:03

Aqui te paso el codigo que tengo yo implementado.

Se hace un ping a la IP de tu Servidor Firebird,si no hay ping, es que no podemos conectar con la BD, si resuelve el ping, ponemos a false la propiedad Connected de la Bd y luego a True y listo.
A mi me funciona tanto en la red local como con la VPN de nuestra otra oficina.

Espero que te valga



Código Delphi [-]
procedure TfrmPrincipal.ConexinconBD1Click(Sender: TObject);
var
 Handle: Integer;
 Buffer: array [0..7] of Cardinal;

begin

 Handle := IcmpCreateFile;
 if Handle = -1 then Exit; // Error interno
 if not LongBool(IcmpSendEcho(Handle, inet_addr(la ip de tu servidor Firebird), nil, 0, nil, @Buffer, SizeOf(Buffer),1000)) then
 begin
  MessageDlg ('Imposible realizar la conexión con la BD', mtError, [mbOK], 0);
  CloseHandle(Handle);
  datDatos.FIBDataBaseICCS.Connected:= False;
 end
 else
 begin
  MessageDlg ('Conexión realizada correctamente', mtInformation, [mbOK], 0);
  datDatos.FIBDataBaseICCS.Connected:= False;
  datDatos.FIBDataBaseICCS.Connected:= True;
 end;

 end;

CarlosHernandez 15-05-2008 18:31:42

disculpen el retraso en responder
 
disculpen en que tarde demasiado en responder, mas de un mes, espero que no me cierren el hilo y sigan respondiendo.

por lo que me dijo el amogo rockin, ya probe el codigo y me da error al compilarlo, que no reconoce
Código Delphi [-]
 Handle := IcmpCreateFile;

me falta declarar algo????

celades1 15-05-2008 19:33:35

Hola

creo debes declarar la funcion como externa
antes del implementation, prueba ya que yo nunca lo he probado


Código Delphi [-]
function IcmpCreateFile : THandle; stdcall; external 'icmp.dll';







Saludos

CarlosHernandez 15-05-2008 23:47:01

gracias celades1, lo probe y nada... lo declare en lo publico, privado y en todos lado y nada, da error, no lo deja compilar.

celades1 16-05-2008 08:14:46

Hola

He hecho la prueba con un form un boton y una BD de Fibplus (Datos) y me ha funcionado correctamente

Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, FIBDatabase, pFIBDatabase,Winsock;
type
  TForm1 = class(TForm)
    Button1: TButton;
    datos: TpFIBDatabase;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
function IcmpCreateFile : THandle; stdcall; external 'icmp.dll';
function IcmpSendEcho
   (IcmpHandle : THandle; DestinationAddress : integer;
    RequestData : Pointer; RequestSize : Smallint;
    RequestOptions : pointer;
    ReplyBuffer : Pointer;
    ReplySize : DWORD;
    Timeout : DWORD) : DWORD; stdcall; external 'icmp.dll';

implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
 Handle: Integer;
 Buffer: array [0..7] of Cardinal;
begin
 Handle := IcmpCreateFile;
 if Handle = -1 then Exit; // Error interno
 if not LongBool(IcmpSendEcho(Handle, inet_addr(pchar('127.195.1.1')), nil, 0, nil, @Buffer, SizeOf(Buffer),1000)) then
 begin
  MessageDlg ('Imposible realizar la conexión con la BD', mtError, [mbOK], 0);
  CloseHandle(Handle);
  Datos.Connected:= False;
 end
 else
 begin
  MessageDlg ('Conexión realizada correctamente', mtInformation, [mbOK], 0);
  Datos.Connected:= False;
  Datos.Connected:= True;
 end;
end;



Saludos

CarlosHernandez 16-05-2008 18:17:28

thank...
 
gracias celades1, el codigo funciona a la perfecion..... ya me quite uno de mis dolores de cabeza jeje....
:cool:

altamente agradecido

Delfino 26-05-2008 12:06:44

Código Delphi [-]
Handle := IcmpCreateFile;
Se puede utilizar tb el componente TIdICMP de las Indy..

DamianG 13-03-2013 12:41:56

Buscando y buscando llegue hasta aquí... lo que no se donde es que se pone ese codigo, debo crear una funcion y fijarme cada vez que hago una consulta?
Gracias


La franja horaria es GMT +2. Ahora son las 12:19:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi