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; Var
Hor, Min, Seg, MSeg: Word;
Dias: Integer;
Begin
Dias := Trunc(Tiempo); 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; Repeat
Try
ZConnection1.Connect;
Except End;
Demora_Conexion := Segundos(Now - TimeOut); If Not ZConnection1.Connected Then Sleep( 3000 ); Until ZConnection1.Connected Or (Demora_Conexion > 120) ; If Not ZConnection1.Connected Then Begin
...
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.