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. ;) |
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 |
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 |
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.
|
Ok
mightydragonlor, estoy de acuerdo con lo que dices pero podrias hacerme un favor... Enseñame como lo hago. Te Agradeceria. ;)
|
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 |
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:
|
Cita:
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 14:16:21. |
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