Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Temas relacionados > Redes
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-02-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
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:
[DATOS]
Entorno=\\JUANI\DatAfi30
Tablas=JUANI/3050:C:\DatAfi30\Tablas
Seguridad=C:\Users\Usuario\Documents\Copia Seguridad
y lo leo, sobre las variables previamente definidas tipo char, con la típica instrucción:
Código:
GetPrivateProfileString("DATOS", "Entorno"  , "C:\\DatAfi30\\"      , cEntorno  , sizeof(cEntorno)  , (ExtractFilePath(Application->ExeName) + "PtoDat30.ini").c_str());
GetPrivateProfileString("DATOS", "Tablas"   , "C:\\DatAfi30\\Tablas", cTablas   , sizeof(cTablas)   , (ExtractFilePath(Application->ExeName) + "PtoDat30.ini").c_str());
GetPrivateProfileString("DATOS", "Seguridad", ""                    , cSeguridad, sizeof(cSeguridad), (ExtractFilePath(Application->ExeName) + "PtoDat30.ini").c_str());
Esto he comprobado que lo hace bien y que los valores que recupera son los que están garabados.
2. Asigno el nombre de la BB.DD. en el elemento TIBDatabase.
Código:
fMenu->GesInt->DatabaseName = AnsiString(cTablas) + "GesInt.fdb";
3. Verifico que la base de datos existe:
Código:
bool TInicio::CreaDb()
{
     try
     {
          if (FileExists(AnsiString(cTablas) + "GesInt.fdb"))
               return true;
               
          fForBln->IniBarra("Creando base de datos");
          fMenu->Auxiliar->Transaction->Active = false;
          fMenu->Query->Transaction->Active    = false;
          fMenu->GesInt->Connected             = false;
          fMenu->GesInt->DatabaseName          = AnsiString(cTablas) + "GesInt.fdb";
          fMenu->GesInt->SQLDialect            = 3;
          fMenu->GesInt->Params->Clear();
          fMenu->GesInt->Params->Add("USER 'sysdba'");
          fMenu->GesInt->Params->Add("PASSWORD 'masterkey'");
          fMenu->GesInt->Params->Add("PAGE_SIZE 4096");
          fMenu->GesInt->Params->Add("DEFAULT CHARACTER SET ISO8859_1 COLLATION ES_ES_CI_AI");
          fMenu->GesInt->CreateDatabase();
     }
     catch(Exception &Exc)
     {
          return false;
     }
     return true;
}
Y aquí es donde esta el problema porque al ejecutar el FileExists la aplicación le responde que no existe y trata de ejecutar la creación de dicha BB.DD. en las líneas siguientes, pero como ya existe lógicamente da error.

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?
Responder Con Cita
  #2  
Antiguo 23-02-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 23-02-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si Tablas es: C:\\DatAfi30\\Tablas
Y haces fMenu->GesInt->DatabaseName = AnsiString(cTablas) + "GesInt.fdb";
Entonces obtienes: C:\\DatAfi30\\TablasGesInt.fdb
Responder Con Cita
  #4  
Antiguo 23-02-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Si Tablas es: C:\\DatAfi30\\Tablas
Y haces fMenu->GesInt->DatabaseName = AnsiString(cTablas) + "GesInt.fdb";
Entonces obtienes: C:\\DatAfi30\\TablasGesInt.fdb
No; ese C:\\DatAfi30\\Tablas es el valor por defecto. Además luego de leer el valor del ini le añado la barra final (cTablas[AnsiString(cTablas).Length()] = '\\';); sé que es una tontería, pero al escribir el código se me olvidó incluirla en el fichero ini y lo arreglé así. En este caso sería JUANI/3050:C:\\DatAfi30\\Tablas porque está definido así en el ini. No obstante he estado haciendo unas pruebas en mi máquina simulando que es una red, y le puesto en el ini en vez del valor original una dirección de red que queda así:
Cita:
cTablas = DEPAPEL/3050:C:\\DatAfi31\\Tablas\\
fMenu->GesInt->DatabaseName = AnsiString(cTablas) + "GesInt.fdb";
y he comprobado que incluso haciéndolo en local con esta simulación da el mismo error. Me tiene totalmente descolocado porque hasta ayer por la mañana funcionaba a la perfección y no veo que haya modificado nada para que ocurra esto.
Responder Con Cita
  #5  
Antiguo 23-02-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿"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...
Responder Con Cita
  #6  
Antiguo 23-02-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿"Juani" es un directorio o un alias?
Es el nombre de la máquina
Cita:
¿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...
Hace unas semanas tuvieron problemas porque se estropeó el disco duro del servidor y tuvieron que cambiarlo, pero quedó todo funcionando a la perfección después de abrir los puertos en el cliente y en el servidor.

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.
Responder Con Cita
  #7  
Antiguo 23-02-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
... si elimino esa comprobación de si existe la BB.DD. funciona a la perfección y arranca sin problemas..
Es que no puedes hacer un FileExists de otro ordenador salvo que tenga el directorio compartido también.
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.
Responder Con Cita
  #8  
Antiguo 23-02-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Vale, me acabas de enseñar una cosa que no sabía.
Mas que no sabía es que no se me había ocurrido: si la carpeta no se "ve" desde el cliente no se puede comprobar la existencia de un fichero en ella.

Última edición por Angel.Matilla fecha: 23-02-2022 a las 18:45:10.
Responder Con Cita
  #9  
Antiguo 23-02-2022
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.085
Poder: 19
juanelo Va por buen camino
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.
__________________
Ya tengo Firma!
Responder Con Cita
  #10  
Antiguo 23-02-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #11  
Antiguo 23-02-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por juanelo Ver Mensaje
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.
Al margen de que por error he borrado mi contestación anterior, tu sugerencia es buena pero si esa exclusividad estuviera presente no permitiría ningún tipo de acción sin los permisos pertinentes, que están concedidos. El problema reside en que antes, con el mismo código, funcionaba bien y ahora no y me estoy volviendo loco tratando de averiguar el por qué.
Responder Con Cita
  #12  
Antiguo 23-02-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
Mas que no sabía es que no se me había ocurrido: si la carpeta no se "ve" desde el cliente no se puede comprobar la existencia de un fichero en ella.
Claro que no, no es su cometido, pero si lo haces así, bueno, pues vale, ya depende de ti y los requesitos que necesites para mantenerlo así o cambiarlo
Responder Con Cita
  #13  
Antiguo 23-02-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por juanelo Ver Mensaje
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.
No recuerdo ahora mismo que exista ningún tipo de exclusividad.
Responder Con Cita
  #14  
Antiguo 23-02-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Claro que no, no es su cometido, pero si lo haces así, bueno, pues vale, ya depende de ti y los requesitos que necesites para mantenerlo así o cambiarlo
Una pregunta, que estaba en el mensjae que he borrado antes por error: ¿Cómo hacéis en una instalación de red para comprobar si existe la BB.DD. o un fichero?
Responder Con Cita
  #15  
Antiguo 23-02-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
Una pregunta, que estaba en el mensjae que he borrado antes por error: ¿Cómo hacéis en una instalación de red para comprobar si existe la BB.DD. o un fichero?
Nada, los programas clientes no tienen que comprobar si existe algo en un servidor. Los programas clientes sólo hacen peticiones al servidor y éste contesta, nada más.
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.
Responder Con Cita
  #16  
Antiguo 23-02-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
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());
if (!FileExists(AnsiString(cEntorno) + "Tablas\\GesInt.fdb"))
etc.
donde la variable cEntorno tiene el valor para la aplicación, una vez leída, \\\\Depapel\\c\\DatAfi30\\ hace el mismo efecto incorrecto. Pero si pongo la dirección a pedal:
Código:
if ("\\\\Depapel\\c\\DatAfi30\\Tablas\\GesInt.fdb"))
etc.
¡Funciona bien! Cada vez lo entiendo menos.
Responder Con Cita
  #17  
Antiguo 23-02-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #18  
Antiguo 23-02-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
la misma aplicación es la que uso pera el servidor y los clientes.
Incluso así, tampoco debes permitirlo. Solamente conectar a la BD y hacer peticiones, nada más.
La diferencia si está en el servidor es que la ruta será localhost:/dondesea/basedatos.fdb
Responder Con Cita
  #19  
Antiguo 24-02-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #20  
Antiguo 02-03-2022
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 933
Poder: 23
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
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:
c:\Program Files\Firebird\Firebird_2_5\Aliases.Conf
Este contiene lo que sigue

Cita:
#
# List of known database aliases
# ------------------------------
#
# Examples:
#
# dummy = c:\data\dummy.fdb

#Aliasname=C:\Ruta\Base\Datos\Firebird

GesInt=C:\DatAfi30\Tablas\GesInt.fdb

#
Luego para la conexión sería:
Cita:
JUANI/3050:GesInt
Si require que el alias apunte a otra base de datos solo modifica la ruta y archivo de base de datos

Saludos cordiales
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error al conectar app con bd Firebird Tiaguito_Power Conexión con bases de datos 5 28-08-2015 21:46:51
Error al conectar BD Firebird Angel.Matilla Firebird e Interbase 28 13-10-2014 12:30:35
Ayuda con error al conectar a Firebird Mauro® Conexión con bases de datos 9 20-02-2008 21:09:42
Error al conectar Firebird+MDO brakaman Conexión con bases de datos 2 08-04-2007 23:49:10
Error al conectar con un BD de Firebird 1.5 con un BDPConnection tarus .NET 2 06-06-2005 10:09:38


La franja horaria es GMT +2. Ahora son las 20:03:05.


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
Copyright 1996-2007 Club Delphi