![]() |
Error al conectar Firebird en red
Primero que nada decir que pongo esta pregunta aquí porque creo que es donde debe ir. Si los administradores consideran más correcto situarla en otro sitio, adelante.
Hace tiempo pedí ayuda para poder conectar una aplicación hecha en BCB 6 a una base de datos Firebird en red. Me distéis una solución en aquel hilo (Conectar Firebird en red). Voy a explicar lo que estoy haciendo en el programa para conectar a la BB.DD. 1. Los valores de la ruta deacceso los guardo en un fichero ini con estos valores: Cita:
Código:
GetPrivateProfileString("DATOS", "Entorno" , "C:\\DatAfi30\\" , cEntorno , sizeof(cEntorno) , (ExtractFilePath(Application->ExeName) + "PtoDat30.ini").c_str()); 2. Asigno el nombre de la BB.DD. en el elemento TIBDatabase. Código:
fMenu->GesInt->DatabaseName = AnsiString(cTablas) + "GesInt.fdb"; Código:
bool TInicio::CreaDb() Hemos comprobado que el puerto 3050 está abierto en ambas máquinas y en desde el equipo cliente se puede ver en el explorador de Windows la BB.DD. en el servidor. He estado mirando cosas por la red sobre conexión de Firebird en red y todas las soluciones apuntan a las sugerencias del hilo que citaba antes. ¿Podéis darme una pista de qué puedo hacer para solucionar este problema? |
Para probar he cambiado el punto de ejecución de ese FileExists al punto justo anterior al que llama a esa función y sigue dando el mismo error.
|
Si Tablas es: C:\\DatAfi30\\Tablas
Y haces fMenu->GesInt->DatabaseName = AnsiString(cTablas) + "GesInt.fdb"; Entonces obtienes: C:\\DatAfi30\\TablasGesInt.fdb |
Cita:
Cita:
|
¿"Juani" es un directorio o un alias?
¿Y si pruebas manualmente, conecta? 192.168.1.100:/ruta/bd.fdb A ver si tienes firebird desactivado, o han instalado un antivirus o algo en el servidor y está cortando el acceso, o firewall... |
Cita:
Cita:
El problema es que hasta ayer por la mañana se conectaba sin problemas. He seguido haciendo pruebas y me he encontrado que si elimino esa comprobación de si existe la BB.DD. funciona a la perfección y arranca sin problemas. Si encontrara la forma de hacer un log de depuración con alguna librería o algo me ayudaría muchísimo. Sigo investigando. |
Cita:
Y un servidor no debe tener nada compartido. Firebird solamente necesita que esté el puerto 3050 abierto, para que puedan comunicarse por él, nada más. |
Cita:
|
Que tal,
A mi me parece mas que va por la exclusividad que tiene el proceso de FBServer para con el archivo fisico (FDB) y este no le concede "permiso" a otro proceso para tener alguna operacion con el archivo. |
Es que el servidor de BD debe ser "cerrado", nadie debe tener acceso a él, la única "puerta abierta" es el puerto 3050 (en este caso) para que pueda recibir peticiones. El cliente pide, el servidor responde.
Pero un programa cliente (o programas cliente en distintos ordenadores) no debe tener acceso al servidor, y mucho menos crear una base de datos allí. El servidor debe tratarse como una fortaleza inexpugnable. Los clientes no pueden conectarse, ver lo que hay, crear bases de datos, borrarlas, etc. todo eso es un gran peligro. En tu caso, supongo que en el servidor se está ejecutando el programa, y en los terminales se está ejecutando un acceso directo al mismo. Si tu programa lo hace, aunque no es un buen método, y tienes implementada esas opciones, tal vez el problema sea de permisos, por eso antes podía y ahora no. |
Cita:
|
Cita:
|
Cita:
|
Cita:
|
Cita:
No es desempeño de un programa cliente mirar qué hay en un servidor. Los programas clientes conectan a la dirección que le han dado, nada más, y si no conecta deberán revisar el servidor qué problema tiene. Es como si tú entras a una página web y te dice que no puede conectar, tú no puedes desde tu navegador cliente mirar si está algún fichero o la BD en el servidor web. |
Gracias. No me lo había planteado así porque la misma aplicación es la que uso pera el servidor y los clientes. Tengo que replantear la forma de conectarse los equipos.
De todas maneras me está ocurriendo una cosa muy curiosa: Si uso el código tal como lo tengo ahora: Código:
GetPrivateProfileString("DATOS", "Entorno", "C:\\DatAfi30\\", cEntorno, sizeof(cEntorno), (ExtractFilePath(Application->ExeName) + "PtoDat30.ini").c_str()); Código:
if ("\\\\Depapel\\c\\DatAfi30\\Tablas\\GesInt.fdb")) |
Hecha un vistazo a esto, es que con tantas barras y demás me parece un poco engorroso. Estoy habituado a servidores linux, algo así: 192.168.1.100:/datos/labasedatos.fdb
|
Cita:
La diferencia si está en el servidor es que la ruta será localhost:/dondesea/basedatos.fdb |
Tienes razón. Por eso digo que conservo demasiados vicios de mi época de programar en Clipper. Muchas gracias por toda la información. Me ha sido muy útil.
|
Estimado Angel.Matilla, si me lo permite quisiera plantear otro punto de vista.
Creo que es muy practivo el uso de alias para indicar la base de datos de conexión, nos permite flexibilizar a que bases de datos nos conectaremos sin hacer mayores cambios a archivos de configuración... Para ello basta definir los alias a las base de datos en el archivo "Aliases.conf", ubicado en carpeta de instalacipón de firebird... Como ejemplo en Cita:
Cita:
Cita:
Saludos cordiales |
La franja horaria es GMT +2. Ahora son las 04:53:18. |
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