Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-06-2013
Avatar de rretamar
[rretamar] rretamar is offline
Miembro Premium
 
Registrado: ago 2006
Ubicación: San Francisco, Córdoba, Argentina
Posts: 1.104
Poder: 13
rretamar Va camino a la fama
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.
__________________
Lazarus Codetyphon : Desarrollo de aplicaciones Object Pascal, libre y multiplataforma.

Última edición por rretamar fecha: 15-06-2013 a las 00:40:06.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Conectando con BD en Access Zucra Conexión con bases de datos 6 11-01-2012 19:38:59
Conectando a MySQL hgiacobone MySQL 14 10-03-2011 02:06:29
Ejecutar programa al inicio antes inicio sesion hibero Varios 0 07-02-2007 21:52:44
conectando con MySQL chipsoni Conexión con bases de datos 7 29-11-2005 22:15:13
Conectando a través de Internet muli Firebird e Interbase 11 12-01-2004 16:45:08


La franja horaria es GMT +2. Ahora son las 05:41:58.


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