PDA

Ver la Versión Completa : Cierre de la Base de Datos


Loviedo
29-04-2005, 21:53:34
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.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:ibtable.close;

fly
30-04-2005, 03:37:58
Yo por si acaso cierro todo, y aún no me han dado problemas.


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


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.