Ver Mensaje Individual
  #11  
Antiguo 13-03-2007
axelbb axelbb is offline
Miembro
 
Registrado: oct 2004
Posts: 127
Reputación: 20
axelbb Va por buen camino
Exclamation Experiencia de conexión con Firebird embebido

Ok, gracias a Fidel, que me ahorró horas (o dias) de trabajo, pude hacer funcionar sin problemas el Firebird embebido (embedded). Para terminar el tema, y si cualquier otra persona llega a necesitar utilizarlo, dejo aquí los pasos que seguí y con los cuales opero sin ningún problema esta interesante variante de Firebird. Lo hago porque hice búsquedas en los foros, y si bien se trató el tema varias veces, no conseguí implementarlo.

¿Qué es el Firebird embebido?

Firebird normalmente se instala como un servidor residente que escucha peticiones en un puerto, al cual habitualmente accedemos indicando una dirección IP del equipo en que se ha instalado. Para que esto funcione, se requiere que el servidor Firebird esté instalado en esa PC y esté iniciado, como mínimo (sin entrar en detalles como usuario y password).

Asimismo, para acceder desde el equipo en que tenemos la aplicación cliente, necesitamos las librerías cliente fbclient.dll o gds32.dll.

Firebird embebido no requiere nada de esto, siempre que se utilice de manera local exclusivamente (es decir en el mismo equipo tendremos la aplicación y los datos). Simplemente se reemplaza alguna de las librerías cliente por otra que viene en un paquete aparte (Embeded server) y se llama fbembed.dll. Claramente, sólo necesitamos nuestra aplicación, la base de datos y esta librería (más algunos otros archivitos), todo en el mismo equipo. De alguna manera, en nuestra aplicación queda embebido el servidor. Ya veremos cómo.

¿Para qué sirve?

1) Para cualquier utilidad que de seguro no requiera ser empleado en red, es decir sin acceso concurrente, ya que únicamente funciona en modo local, y además hace uso exclusivo de la base de datos, así que ni siquiera puede accederse desde otra instancia de nuestro mismo programa simultáneamente. Esta posibilidad nos ahorra hacerle instalar y configurar el servidor a nuestro
usuario. Así, se hace una alternativa excelente a usar simples ficheros .dbf para aplicaciones menores, con toda la posibilidad de extender luego ese mismo programa a mayores prestaciones con el servidor a pleno.

2) Para hacer por ejemplo un CD con gran cantidad de información, que guardamos como base de datos de Firebird y hacemos read_only, y lleva en ese CD TODO LO NECESARIO para funcionar, sin necesidad que el usuario instale Firebird. Esto es una comodidad enorme.

3) Si queremos enviar un demo de nuestro programa, se hace muy sencillo que el usuario lo instale y elimine aún con conocimientos básicos de informática, ya que hasta podría tenerlo en un pen drive.

¿Cuáles son las limitaciones?

Repetimos: Solamente uso local y exclusivo de la base de datos. Se ignora cualquier instalación que exista de Firebird, así como las entradas de registro. El root directory es el que contiene a la librería fbembed.dll. El uso exclusivo es sobre una base de datos. Si tengo dos aplicaciones en el mismo equipo accediendo a bases de datos distintas, no hay conflicto alguno.

Además, no hace caso de usuarios o claves para conectarse. Cualquier user_name o password le viene bien para conectarse a cualquier base de datos del equipo. Esto no tiene nada que ver con los privilegios otorgados en la base de datos. Es decir, me conecto como usuario "yo", pero si en la base de datos ese usuario no existe, no podrá hacer nada una vez conectado.

Desde ya que el usuario SYSDBA, con cualquier password que le pongamos, se conecta con permiso completo.

Para utilizar la base de datos en un CD, hay que crearla Read Only.

Por lo demás, no habría limitaciones, todo el sistema que antes andaba con servidor, debe operar igualmente con el embebido. Debe aceptar todo el SQL. En rigor, si esto es lo que aseguran desde IBPhoenix, no es 100% así, yo tuve que quitar de la parametrización del componente DataBase la línea:

lc_ctype=ISO8859_1

porque no era reconocida y arrojaba error. Es más, si una BD fue cread con SET NAMES o DEFAULT CHARACTER SET ISO..., seguramente no funcionará, al menos a mí me daba ese error. No sería extraño que hubiera otras limitaciones.

¿Cómo se utiliza?

Primero, conseguiremos la distribución del Firebird Embeded Server, en el mismo sitio de descargas que Firebird Superserver. Viene en un .zip. Lo descomprimimos.

Segundo, se arma una estructura de carpetas como sigue:

Mínimamente:

Carpeta principal=> x:\...\MiPrograma

Dentro de ésta ponemos los siguientes archivos:
.\MiEjecutable.exe y los demás que tenga con él
.\MiBaseDeDatos.fdb (puede ir en otra carpeta siempre que esté en el mismo equipo)
.\firebird.msg
.\fbclient.dll ó gds32.dll (fbembed.dll renombrada a una de éstas)
.\icudt30.dll (Estas tres últimas, se incorporan en caso que usemos Firebird 2
.\icuin30.dll No están en las 1.5.x.)
.\icuuc30.dll


NOTA: Cualquiera(fbclient o gds32) sirve, porque en realidad es la famosa "fbembed.dll" QUE HA SIDO RENOMBRADA a uno de esos nombres, dependiendo de la librería de acceso que hayamos elegido en el componente de conexión:

* Para InterBase Data Access Components: Renombrar a gds32.dll
* Para MDO Mercury Objects: Podemos elegir en la propiedad ClientLib cuál usar, y según ésta es el nombre que le daremos.
* Para dbExpress: En propiedad VendorLib pondremos cualquiera de las dos, y el mismo nombre le daremos a la fbembed.dll. También funciona si no la renombramos, pero en VendorLib ponemos fbembed.dll.

Si nuestro sistema usa UDF's, o decidimos cambiar alguna configuración por defecto de Firebird, agregamos:

.\firebird.conf
.\ib_util.dll
.\intl\fbintl.dll
.\udf\fbudf.dll


Ver el Readme_embedded.txt que viene dentro del .zip para más detalles y variantes, como instalar el embebido en otra carpeta del equipo.

Bien, aquí se me presentaron algunos problemas:
Al tener instalado un servidor Firebird en mi PC de desarrollo, los componentes insistían en encontrar algún otro fbclient.dll en alguna otra parte de la PC, sin llevarme el más mínimo apunte a que en el directorio de la aplicación tenía mi bembed.dll "disfrazado" de fbclient.dll.

Si el servidor estaba operativo, todo funcionaba bien, pero en cuanto detenía el servicio para probar el embebido, daba errores. La única forma que encontré fue hacer una búsqueda en toda la PC y eliminé todo rastro de fbclient.dll y gds32.dll que hubiera. Solamente dejé las de la carpeta bin de firebird, pero renombradas a "_fbclient.dll" y "_gds32.dll" para usarlas cuando me hicieran falta. Aún no sé por qué, pero de esta manera sí comenzó a utilizar el sistema embebido.

Si alguien tiene el mismo problema, pruebe a hacer esto.

Otra cosa muy importante, es que no utilizamos cadenas de conexión al estilo:

192.165.0.212:C:\MiSistema\Database\MiBD.fdb
ó
127.0.0.1:C:\MiSistema\Database\MiBD.fdb

Cuando usamos embebido, solamente pondremos esto:

C:\MiSistema\Database\MiBD.fdb

¡¡Prestar atención a ese punto!!

Aclaremos que si le ponemos una IP, y el servidor en esa IP existe y está funcionando, se comporta como la fbclient.dll original, accediendo a la base de datos indicada en la cadena de conexión.

En resumen, los pasos son:

1) Descargar el paquete del embebido y armar la estructura de carpetas que necesitamos.
2) Detener el servicio Firebird, si es que está instalado y operando.
3) Quitar todas las fbclient.dll que haya en el sistema.
4) Cambiar la cadena de conexión de nuestra aplicación al modo local, sin la IP previa (C:\MiSistema\Database\MiBD.fdb)
5) Poner en la carpeta de la aplicación la "fbembed.dll" pero renombrada a fbclient.dll, por ejemplo.
6) Activar la conexión. Si se hizo todo como está indicado, debería funcionar!!

Cualquier comentario que corrija o complete este post será bien recibido para completar el tema y que quede disponible para futuras consultas.

Última edición por axelbb fecha: 13-03-2007 a las 21:56:34. Razón: Falta incorporar informacion
Responder Con Cita