Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-10-2006
ErnestoCarrera ErnestoCarrera is offline
Miembro
 
Registrado: abr 2006
Posts: 11
Poder: 0
ErnestoCarrera Va por buen camino
¿Como detectar si el servidor de bases de datos está lanzado?

Hola buenas,

Les cuento mi problema: resulta que tengo una aplicación desarrollada con Delphi6 y que necesita conectarse al arrancar con una base de datos. El servidor de base de datos es el firebird 1.5.2.4731. La susodicha aplicación se lanza al inicio de windows y hay veces (no muchas, la verdad), que al arrancar el PC me da un mensaje de error del estilo : "unavailable database".

Sospecho que es porque el programa se lanza antes de que el servicio de Firebird esté lanzado, así que me gustaría saber cómo se puede detectar si el servicio está o no lanzado para que mi programa espere por él.

He usado la opción buscar pero la verdad es que no he encontrado nada que me solucione la vida, así que si algún alma caritativa se apiada de mí y me ayuda le estaré eternamente agradecido
Responder Con Cita
  #2  
Antiguo 03-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Supongo que ese error te da al intentar activar la conexión con la Base de Datos (al abrir tablas o ejecutar consultas); Puedes probar a activar la conexión al principio y capturar (try..except) los errores que te de.
En ese punto deberías poder hacer varios reintentos con un breve lapso de tiempo entre medio, para "esperar" a que el servidor se arranque.


Otra cosa que puedes hacer es, al principio preguntar si el Servicio del servidor de FireBird está activo, sino es así esperar y volver a preguntar (repetir esto unas cuantas veces) antes de generar el error.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 03-10-2006
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Yo sugiero que tu aplicación la generes como un servicio y le asignes en la propiedad Dependencies el servicio de Firebird, con eso tu programa no va a iniciar hasta que el servicio Firebird este iniciado.

Saludos.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #4  
Antiguo 03-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Solo añadir un poco de codigo:

Código Delphi [-]
uses WinSvc;

// Para comprobar si un servicio esta corriendo
function isRunning(Nombre: String): Boolean;
var
 ServiceControlManager: SC_HANDLE;
 Service: SC_HANDLE;
 ServiceStatus: SERVICE_STATUS;
begin
  Result:= FALSE;
  ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
  if ServiceControlManager <> 0 then
  begin
    Service:= OpenService(ServiceControlManager,PChar(Nombre),GENERIC_READ);
    if Service <> 0 then
    begin
      if QueryServiceStatus(Service, ServiceStatus) then
        Result:= ServiceStatus.dwCurrentState = SERVICE_RUNNING;
      CloseServiceHandle(Service);
    end;
    CloseServiceHandle(ServiceControlManager);
  end;
end;


function Esperar(Nombre: String; TimeOut: Cardinal): Boolean;
var
  Ticks: Cardinal;
begin
  Result:= TRUE;
  Ticks:= GetTickCount;
  while not isRunning(Nombre) do
  begin
    Sleep(10);
    if GetTickCount - Ticks > TimeOut then
    begin
      Result:= FALSE;
      Exit;
    end;
  end;
end;

La primera función nos dice si un servicio esta iniciado, y la segunda espera hasta que el servicio se inicia o se cumple el tiempo de espera. Si el servicio no esta iniciado cuando se cumple el tiempo de espera la función devuelve FALSE. Un ejemplo de como usar lo anterior:

Código Delphi [-]
// Le damos 15 segundos de margen
if Esperar('NombreDelServicio',15000) then
begin
  // El servicio esta iniciado
end else
begin
  // Pasaron los 15 segundos y el servicio sigue inactivo
end;
Responder Con Cita
  #5  
Antiguo 04-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Thumbs up

¡¡Qué grande Seoane!!!

Uno pide...
Cita:
Empezado por Neftali
...Otra cosa que puedes hacer es, al principio preguntar si el Servicio del servidor de FireBird está activo, sino es así esperar y volver a preguntar (repetir esto unas cuantas veces) antes de generar el error.
Y tú contestas...
Cita:
Empezado por seoane
La primera función nos dice si un servicio esta iniciado, y la segunda espera hasta que el servicio se inicia o se cumple el tiempo de espera.
P.D: Se podría añadir como truco.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 04-10-2006
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
seoane, y en los ratos libres, ¿qué haces?

Muy bueno ese código.
Responder Con Cita
  #7  
Antiguo 04-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por Casimiro Notevi
seoane, y en los ratos libres, ¿qué haces?
En mis ratos libres busco trabajo e intento estudiar una oposición, pero es mas divertido estar por aquí todo el día, que pena que no me paguen por eso

Cita:
Empezado por Neftali
P.D: Se podría añadir como truco.
PD: Ahora mismo lo coloco en la seccion de trucos, aunque ya es muy similar a otro que puse sobre iniciar y detener servicios.
Responder Con Cita
  #8  
Antiguo 04-10-2006
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por seoane
En mis ratos libres busco trabajo e intento estudiar una oposición, pero es mas divertido estar por aquí todo el día, que pena que no me paguen por eso

PD: Ahora mismo lo coloco en la seccion de trucos, aunque ya es muy similar a otro que puse sobre iniciar y detener servicios.
Pensando en esa frase, ¿os habéis dado cuenta la cantidad tan enorme de trabajo, tiempo y dinero que le estamos ahorrando a muchas empresas cuyos programadores acuden a clubdelphi?

Me incluyo, también, porque más de una vez me habéis ayudado y al final, la beneficiada ha sido la empresa donde trabajo.
Responder Con Cita
Respuesta



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
instalar servidor de bases de datos haron MS SQL Server 4 12-05-2008 23:28:54
Como Detectar cuando Windows se esta Cerrando???? AGAG4 API de Windows 3 24-05-2005 16:29:18
Como mostrar una lista de bases de datos en un servidor MySQL con Zeos? guillote Conexión con bases de datos 1 30-07-2004 02:25:42
Como puedo mostrar una lista de bases de datos en un servidor MySQL con Zeos? guillote MySQL 0 27-07-2004 03:32:20
¿Siempre hay que poner la ruta completa de la base de datos que está en el servidor? Al González Firebird e Interbase 2 12-05-2004 22:06:25


La franja horaria es GMT +2. Ahora son las 03:47: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
Copyright 1996-2007 Club Delphi