Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Conectando a un motor SQL en el inicio (https://www.clubdelphi.com/foros/showthread.php?t=83410)

rretamar 15-06-2013 00:37:00

Conectando a un motor SQL en el inicio
 
Un problema que puede presentarse cuando tenemos una aplicación que accede a un motor de base de datos SQL (por ejemplo Firebird) y que arranca automáticamente al iniciarse el sistema operativo (Linux, Windows, etc.) es que puede darse el caso de que la aplicación arranque e intente conectarse cuando el motor SQL aún no arrancó (normalmente se ejecutan como un servicio). Ante esto, lo que hago es reintentar el acceso al motor durante un cierto tiempo (120 segundos, o sea dos minutos), y registrar el tiempo que se demoró en conectar. El código lo uso en Lazarus pero debería funcionar sin problemas con Delphi:


Para eso, vamos a usar un temporizador, por medio de una variable de tipo TDateTime:

Código Delphi [-]
Var
  TimeOut: TDateTime;
  Demora_Conexion: Int64;

Usaremos una función que convierte a segundos una variable TDateTime (mejor dicho, la diferencia entre dos valores TDateTime):

Código Delphi [-]
Function Segundos(Tiempo: TDateTime): Int64; // Expresar [hora] en segundos
Var
  Hor, Min, Seg, MSeg: Word;
  Dias: Integer;
Begin
  Dias := Trunc(Tiempo);   // Obtener los días (parte entera de [Hora])
  DecodeTime(Tiempo, Hor, Min, Seg, MSeg);
  Result := (Dias * 86400) + (Hor * 3600) + (Min * 60) + Seg;
End;

Intentamos conectar a la base de datos (en el ejemplo se usan los componentes libres ZeosLib, más exactamente ZConnection):

Código Delphi [-]
  Timeout := Now;             // Iniciamos el temporizador
  //
  Repeat
    Try
      ZConnection1.Connect;
    Except End;
    Demora_Conexion := Segundos(Now - TimeOut);      // Obtener el valor del temporizador expresado en segundos
    If Not ZConnection1.Connected Then Sleep( 3000 ); // Esperar tres segundos
  Until ZConnection1.Connected Or (Demora_Conexion > 120) ;   // Si se conectó o el temporizador superó los 120 segundos, salir del bucle de reintentos
  //
  If Not ZConnection1.Connected Then // No se pudo conectar con la base de datos, abortar
    Begin
            // Indicar que se produjo un error y abortar
      ...
    End;

Nota: La función "segundos" obviamente puede desbordarse si se le proporciona un valor de TDatetime muy grande, pero en este código no existe ese problema, porque se utiliza la diferencia entre dos variables TDateTime, que es un valor pequeño. ^\||/


La franja horaria es GMT +2. Ahora son las 16:23:36.

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