Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ¿Como detectar si el servidor de bases de datos está lanzado? (https://www.clubdelphi.com/foros/showthread.php?t=36145)

ErnestoCarrera 03-10-2006 18:19:57

¿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 :D:D:D

Neftali [Germán.Estévez] 03-10-2006 18:44:45

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.

egostar 03-10-2006 19:03:33

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.

seoane 03-10-2006 19:40:38

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;

Neftali [Germán.Estévez] 04-10-2006 10:25:11

¡¡Qué grande Seoane!!!

Uno pide... :confused: :confused:
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... :D :D
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.

Casimiro Notevi 04-10-2006 12:38:17

seoane, y en los ratos libres, ¿qué haces? :)

Muy bueno ese código.

seoane 04-10-2006 13:44:08

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, :o pero es mas divertido estar por aquí todo el día, que pena que no me paguen por eso :D

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.

Casimiro Notevi 04-10-2006 15:06:24

Cita:

Empezado por seoane
En mis ratos libres busco trabajo e intento estudiar una oposición, :o pero es mas divertido estar por aquí todo el día, que pena que no me paguen por eso :D

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.

dec 04-10-2006 15:32:16

Hola,

Cita:

Empezado por Neftalí
¡¡Qué grande Seoane!!!

Cita:

Empezado por Casimiro
seoane, y en los ratos libres, ¿qué haces?

Na... todo el mundo sabe que Seoane copia y pega el código de por ahí... :D :D :D

Bicho 04-10-2006 15:35:40

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.

Por eso no te van a contratar, :D
Si te tienen aquí en el Club donde les solucionas sus problemas y sin pagarte un duro :mad:

Además tanto tiempo aquí no puede ser bueno, ya ves que cada vez que hay algún problema con el servidor, hay pánico y aburrimiento entre los foristas. Pero sin llegar al suicidio colectivo eh? :rolleyes: Y tampoco estudiarás mucho tanto tiempo aquí.

Bueno, todo esto es broma, no se lo tomen a mal.

Le pediria a Seoane para que plaza está estudiando sólo por curiosidad eh?, no me voy a presentar tranquilo ;) A coruña me pilla en la otra punta de España. De todos modos suerte

Saludos.

seoane 04-10-2006 16:02:49

Cita:

Empezado por Bicho
Le pediria a Seoane para que plaza está estudiando sólo por curiosidad eh?, no me voy a presentar tranquilo ;) A coruña me pilla en la otra punta de España. De todos modos suerte

Estudiar lo que se dice estudiar, estudio mas bien poco, :p así me va. Me presente por acompañar a un amigo a la de "TÉCNICO ESPECIALISTA DE INFORMÁTICA" de la Universidad de A Coruña, y aunque pase la nota de corte quede muy lejos de los puestos de cabeza y por lo tanto de conseguir el puesto (aunque si se mueren unos 20 fulanos entro fijo :p ). Ahora estoy con las de la universidad de Santiago, pase el primer examen pero sigo estando lejos de los primeros puestos, así que voy a tener que ponerme las pilas en el siguiente examen. Como ya dije estudiar, estudio poco .... Pero la verdad la vida de funcionario / personal laboral, es maravillosa. Yo probé un poco, estuve trabajando un año para la universidad de encargado de un aula de informática y nunca estuve tan relajado, vale que el puesto no suponía ningún reto, no me aportaba nada y me pagaban poco pero me pasaba el día sentado delante de un ordenador viendo pasar universitarias, sin nada mas que hacer, lo echo de menos :(

ErnestoCarrera 04-10-2006 18:37:13

Joder, sois unas fieras :cool::cool:

Muchas gracias por la atención, en especial a Seoane por ese código que tan buena pinta tiene. Lo probaré en cuanto llegue a casa, que aunque en este caso no le ahorrais dinero a una empresa, ya me habeis zafado de alguna en el curro:D:D.

Nunca me cansare de alabar lo bueno que es el foro. Seguid así.

ZRR 26-04-2007 02:03:30

Alguien sabe...
 
como se llama el nombre del servicio que tiene Firebird?

He intentado con "fbserver" y "fbguard" pero no lo encuentra con ninguno de los dos nombres. En el administrador de tareas estan esos dos.

Saludos

Casimiro Notevi 26-04-2007 09:43:22

FirebirdGuardianDefaultInstance
FirebirdServerDefaultInstance

ZRR 27-04-2007 03:19:37

Se puede hacer con Mutex?
 
Tengo una validación para que no se ejecuten dos instancias de mi aplicación y funciona correctamente. Pero al validar lo mismo pero con el guardian Firebird no lo valida e intenta correrlo de nuevo, lo que genera un mensaje de error.

Mi código es el siguiente:


Código Delphi [-]
  MiMutex:= CreateMutex(nil,true,'fbguard');
  if MiMutex=0 then
  begin
   MessageDlg('Error al verificar monitor de Base de Datos.', mtError, [mbOk], 0);
  end;
  if GetLastError<>ERROR_ALREADY_EXISTS then //no esta ejecutandose
  begin
   WinExec(Pchar(rutaFB), SW_SHOW);
  end;





Al parecer no encuentra el programa con el nombre 'fbguard', tambien intente con 'fbserver', FirebirdGuardianDefaultInstance, FirebirdServerDefaultInstance y no funciona.

Alguien conoce el nombre con el que se identifica el programa de guardian de Firebird?

Saludos

seoane 27-04-2007 03:25:57

:eek: :confused: ¿Quien se supone que crea el mutex?

xander 27-04-2007 03:40:24

Definitivamente eres un "escapao" Seoane... peazo e' codigos te avientas...

Vaya que ni la identación te puede uno criticar :D


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

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