Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Reconección a BD (https://www.clubdelphi.com/foros/showthread.php?t=68855)

JUGUE 10-07-2010 23:11:25

Reconección a BD
 
Hola amigos...

Tengo una aplicacion (Delphi 7) la cual funciona en varios equipos conectados por medio de una red inalámbrica a un Servidor donde está la base de datos (Firebird 2.0).
El problema es que durante el dia esta conexión se cae en ocasiones y se restablece al instante, pero la aplicación se cuelga de una y me manda este mensaje (Unable to complete network request to host "Servidor"). y me toca cerrar la aplicación a la brava y volver a ejecutarla.
No se como hacer para evitar este error, hay alguna forma de volver a conectarse dentro de la aplicacion o de estar desconectado siempre y solo hacer conexión con la Bd cuando se requiera verificando previamente si se puede establecer dicha conexión.

Su ayuda me será muy útil, trabajo con los componentes IBDatabase e IBTransaction.

De antemano muchas gracias. ;)

Caral 10-07-2010 23:26:51

Hola
Me imagino que la conexion la haces en un datamodule?.
Una forma seria colocar un timer que verifique cada cierto tiempo la conexion, conectando si esta desconectada.
Saludos

Gallosuarez 11-07-2010 04:11:06

Analisis...
 
Jugue:

En tu caso, yo empezaría de la siguiente manera. Asegúrate que la versión de tu base de datos instalada, sea la última disponible (en tu caso la última versión disponible es la 2.0.6.132266_0), esto es de suma importancia, acuerdate que los "subrelease" corrigen sobre todo errores en el motor de la base de datos. Despues asegúrate que las instalaciones físicas estén operando correctamente (cuantos equipos en forma inalámbrica accesan a tu base de datos [revisa que no se caigan las conexiones de la red inalámbrica). Por último revisa tu sistema de posibles errores (revisar si al hacer algún proceso especifico es cuando ocurre el error o si es totalmente aletorio). Tu mejor que nadie, debes de hacer este análisis.

Saludos,

Gerardo Suárez Trejo

P.D. Espero que de algo te sirvan estos "tips", y no dejes de platicarnos como te fué.:D

mightydragonlor 11-07-2010 19:57:04

primero que todo, una conexión a la base de datos solo de abrirse cuando se necesita y cerrarse inmediatamente después de tomar lo que buscas.

JUGUE 12-07-2010 23:37:05

Ok
 
mightydragonlor, estoy de acuerdo con lo que dices pero podrias hacerme un favor... Enseñame como lo hago. Te Agradeceria. ;)

Caral 13-07-2010 04:33:12

Hola
Yo no creo que sea una sana opcion.
Abrir la conexion, hacer lo que se necesite y cerrarla me parece muy tosco, por decirlo de alguna manera.
Lo que si es logico es abrir y cerrar las tablas, no la conexion con la BD, son cosas diferentes.
Saludos

mightydragonlor 13-07-2010 05:03:33

bueno, la opción correcta("a mi parecer") sería usar procedimientos almacenados y vaciar los datos en un TClientDataSet, así de ser necesario capturas los cambios y los envías uno a uno a la base de datos, también usando procedimientos almacenados, hace un buen rato no trabajo con delphi, ahora estoy mas en el lado de lazarus, pero hay un componente de "TIBConnection", este trae una propiedad "KeepConnection := False" por defecto, esto hace que una vez se deje de usar la conexión la cierra, podrias ver si los componentes que usas para conectar a la base de datos trae algo parecido.

Cita:

Abrir la conexion, hacer lo que se necesite y cerrarla me parece muy tosco, por decirlo de alguna manera.
Ahora bien, la verdad es que dejar una conexión abierta es un "GRAVE ERROR", a mi parecer esto se hace en un juego online o en clientes de mensajería por la actividad, y eso que con lo de la mensajería es cuestionable, la razón de esto es que por cada conexión que haya en la base de datos el servidor gasta valiosos recursos en algo que no necesita, para que tener 100 conexiones abiertas que no necesitas si puedes tener muchos mas usuarios en un servidor administrandolas bien?. de hecho trabajar directamente en las tablas es algo obsoleto, ya que el manejador de base de datos hace planes de ejecución para los procedimientos almacenados y eleva enormemente la velocidad y eficiencia, ademas que para eso es que tenemos nuestra base de datos, saludos.

guillotmarc 13-07-2010 11:22:59

Cita:

Empezado por JUGUE (Mensaje 370144)
mightydragonlor, estoy de acuerdo con lo que dices pero podrias hacerme un favor... Enseñame como lo hago. Te Agradeceria. ;)

Supongamos que tu conexión se llama Cn.

Pues cuando quieras abrir la conexión llamas a Cn.Open, entonces haces lo que debes hacer y cuando hayas terminado cierras la conexión con Cn.Close.

Ejemplo :

Cn.Open.
qryFacturarAlbaranes.ExecQuery;
Cn.Close;

Ahora bien, te vas a encontrar con varios problemas. Los componentes que utilizas necesitan la conexión abierta y la transacción abierta para tener abierto un Dataset (y poder mostrar datos en una Grid, pro ejemplo).

Así que tienes que hacer lo que dice mightydragonlor, es decir, trabajar con ClientDatasets. De forma que tu Dataset estará almacenado en un ClientDataset (en memoria local de la maquina cliente) de manera que puedes cerrar perfectamente la conexión con la base de datos, y no necesitarás volver a conectarla hasta que no quieras trasladar con un ApplyUpdates los cambios (altas, bajas, modificaciones, ...) que se hayan hecho en el ClientDataset.

Cn.Open;
ClientdatasetClientes.Open;
Cn.Close;

...
...
... Luego cuando quieras guardar cambios :

Cn.Open;
ClientdatasetClientes.ApplyUpdates(0);
Cn.Close;


NOTA: Trabajar así es laborioso, pero si tu red inalámbrica se cae tanto como dices, entonces parece que no tienes otro remedio. Busca como dice mightydragonlor, a ver si tu componente de conexión tiene un propiedad KeepConnection, Timeout, ... que cierre automáticamente la conexión si no se utiliza (aunque naturalmente, para ello debes asegurarte de no mantener Datasets abiertos, y para ello los tienes que pasar todos a ClientDatasets).


La franja horaria es GMT +2. Ahora son las 11:26:27.

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