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)
-   -   Cierre de la Base de Datos (https://www.clubdelphi.com/foros/showthread.php?t=20932)

Loviedo 29-04-2005 21:53:34

Cierre de la Base de Datos
 
Hola.
¿ Es normal que la Base de Datos se cierre después que la Aplicación?.
Tengo un programa y utilizo Firebird, cuando lo cierro(Application.terminate) desaparece el form principal, pero si lo ejecuto inmediatamente me produce un error porque todavía está la base abierta. Si espero unos segundos todo funciona correctamente. ¿ Es correcto?.
Gracias anticipadas.

carlosegs 29-04-2005 23:38:30

Hola Loviedo!

Que lástima que este mensaje no sea una respuesta a tu pregunta. Tengo FireBird 1.5 y hasta el momento no se como utilizarlo debido a que siempre he manejado BD tipo Dbase. ¿Me puedes explicar como trabajar FireBird con Delphi 5? (podría ser a través del MSN o de correos electrónicos) Gracias.

Loviedo 30-04-2005 01:52:31

Hace muy poco tiempo que utilizo esta base de datos, pero Firebird es como todas, solo que más potente. Otra cosa es sacarle el máximo rendimiento.
Firebird es igual que Interbase, por lo que puedes utilizar los componentes IBX de Delphi (TIBDatabase, TIBdataset,..etc.) y no necesitas el BDE.
Yo utilizo IBExpert que es free para crear tablas,procedimientos almacenados...
Su uso principalmente es para aplicaciones cliente/servidor, aunque tambien la puedes utilizar como base de escritorio.
Te recomiendo que leas el foro dedicado a esta base de datos, se aprende mucho. Sólo soy un aficionado.
Saludos.

vtdeleon 30-04-2005 02:05:52

Saludos.
Cita:

Empezado por Loviedo
Hola.
¿ Es normal que la Base de Datos se cierre después que la Aplicación?.
Tengo un programa y utilizo Firebird, cuando lo cierro(Application.terminate)

Cuando cierras la aplicacion, cierras las base de datos?
por ej:
Código Delphi [-]
ibtable.close;

fly 30-04-2005 03:37:58

Yo por si acaso cierro todo, y aún no me han dado problemas.


Código:

procedure TMenu_F.Salir;
begin
Dmq1.IBTransaction.Commit; // Guardar y cerrar transaccion...
Dmq1.IBTransaction.Active:=false; // ...ya deberia estar cerrada pero por si acaso...
Dmq1.IBDatabase.CloseDataSets; // ...idem con los datasets...
Dmq1.IBDatabase.Close; // ...la base de datos...
Report_DMQ.RvProject1.Close; // ...el proyecto de rave...
Menu_F.Close; // ...el form...
end; // ...y pa casa.


Loviedo 30-04-2005 06:30:53

procedure TFmain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IBD1.Connected := false;
Application.terminate;
end;
Aunque funciona bien, se cierra la base de datos después que la aplicación.
Lo he podido comprobar porque ejecuto el programa inmediatamente después de haberlo cerrado y da error, es por lo que quiero tener garantía de que la base de datos está cerrada.
Saludos.

Lepe 30-04-2005 11:43:57

Código Delphi [-]
procedure TFmain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  IBD1.Connected := false;
  Action := cafree;
end;

Para cada ventana que se cierra, delphi comprueba si se trata del MainForm, si lo es, despues de ejecutar varios eventos, llamará a Terminate.

Tal como dice la ayuda, terminate es asincrono, por eso tarda un poquito en cerrar todo.

Una cosa es que la ventana principal desaparezca de tu vista y otra que haya terminado completamente de cerrarse todos los recursos apropiados. Puedes verlo en la Unidad Forms:

Código Delphi [-]
procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then
    ModalResult := mrCancel
  else
    if CloseQuery then
    begin
      if FormStyle = fsMDIChild then
        if biMinimize in BorderIcons then
          CloseAction := caMinimize else
          CloseAction := caNone
      else
        CloseAction := caHide;
      DoClose(CloseAction);
      if CloseAction <> caNone then
        if Application.MainForm = Self then Application.Terminate
        else if CloseAction = caHide then Hide
        else if CloseAction = caMinimize then WindowState := wsMinimized
        else Release;
    end;
end;

procedure TCustomForm.DoClose(var Action: TCloseAction);
begin
  if Assigned(FOnClose) then FOnClose(Self, Action); 
 ahora se pone tu base de datos en false
end;

Como ves, el evento OnClose tiene más "cosas que hacer" además de tu código. Al abrir rapidamente el programa, puede que aún no haya cerrado la base de datos, y por eso te dé el fallo.

Un saludo

Loviedo 30-04-2005 13:36:43

Quedo agradecido.
Saludos.


La franja horaria es GMT +2. Ahora son las 23:18:29.

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