PDA

Ver la Versión Completa : Conectar con Firebird indicando la ruta relativa al fichero, no absoluta


verm83
06-03-2004, 21:57:24
Hola.
Tengo una duda, aunque lo mismo es una tontería, y no me doy cuenta que hago mal. Intento conectar con Delphi/FIBPlus a una base de datos de Firebird, pero me gustaría hacerlo indicando una ruta relativa, no absoluta. Esta apliación que estoy haciendo debe correr en cualquier máquina, y durante la instalación, cada usuario usará una carpeta de instalación distinta. Me gustaría saber si es posible indicar en el DataBase la ruta de manera relativa.

Muchas gracias anticipadas.

jachguate
07-03-2004, 00:27:56
Si es posible, pero tiene que ser una ruta relativa a la carpeta "actual" del servidor de intarbase.

Creo que será mas fácil, en tiempo de ejecución, averiguar la carpeta en la que está corriendo tu aplicación, y luego construir la ruta de la base de datos, no te parece?

Algo como:


RutaBD := ExtractFilePath(ExpandFileName(ParamStr(0))) + 'datos\basededatos.fdb';
// te devolverá 'c:\archivos de programa\tuprograma\datos\basededatos.fdb'
// por ejemplo.


Hasta luego.

;)

verm83
07-03-2004, 03:28:11
Buenas de nuevo.

Muchas gracias por solucionarme el problema :). El fallo que yo tenía es que pensaba que la de la ruta base de datos la tenía que especificar obligatoriamente en tiempo de diseño, y no es asi. En mi componente DataBase he eliminado todo lo referente al user/pass y la ruta, y en el FormShow de la ventana principal de mi aplicación he añadido esto:


//Compruebo que existe la BD
if vModuloDatos.BaseDatos.Connected then
vModuloDatos.BaseDatos.Connected:=False;
if fileexists(ExtractFilePath(ExpandFileName(ParamStr(0)))+'bdatos\bdatos.gdb') then
begin
vModuloDatos.BaseDatos.DBName:=ExtractFilePath(ExpandFileName(ParamStr(0)))+'bdatos\bdatos.gdb';
vModuloDatos.BaseDatos.ConnectParams.UserName:='xxx';
vModuloDatos.BaseDatos.ConnectParams.Password:='xxx';
vModuloDatos.BaseDatos.Connected:=True;
end;

Así que ahora funciona perfectamente, justo lo que necesitaba. Un millón de gracias jachguate ;)

orodriguezc
08-03-2004, 19:12:52
No entiendo... Y si el PC Cliente no tiene acceso físico al fichero de la base de datos (se supone que no es necesario)?

jachguate
08-03-2004, 21:09:48
claro que no es necesario. Creo que no has entendido bien la propuesta del hilo, que nada tiene que ver con esto. Te recomiendo su re-lectura. Hasta luego. ;)

orodriguezc
08-03-2004, 23:00:59
Jachguate, seguí tu consejo y releí el hilo varias veces, pero sigo confundido. Veamos si logro plantear mi duda:

verm83 escribió la siguiente línea de código:

if fileexists(ExtractFilePath(ExpandFileName(ParamStr(0)))+'bdatos\bdatos.gdb') then

Supongo que este código lo está ejecutando la aplicación que se ejecuta en el PC Cliente, por tanto solo devolverá True si el usuario logueado en el PC cliente tiene acceso a 'RUTA\bdatos\bdatos.gdb'. Es así o estoy errado?. Si estoy en lo correcto creo que esta configuración compromete la seguridad del Sistema.

El código tambien asume que tanto el servidor de base de datos FireBird como el aplicativo se encuentran en la misma máquina. De llegar a estar en máquinas diferente el código no funcionaría. Es Así o estoy errado?


Si en ambos casos me equivoco por favor corregidme y asi aprendemos todos :) . Muchas gracias.

jachguate
08-03-2004, 23:16:49
Supongo que este código lo está ejecutando la aplicación que se ejecuta en el PC Cliente, por tanto solo devolverá True si el usuario logueado en el PC cliente tiene acceso a 'RUTA\bdatos\bdatos.gdb'. Es así o estoy errado?. Si estoy en lo correcto creo que esta configuración compromete la seguridad del Sistema.


Hola orodriguez.

Todas tus suposiciones son ciertas. Lo dicho sobre la seguridad del sistema seria muy cierto en el caso de un sistema que requiera de un entorno seguro... pero hay muchos desarrollos orientados al escritorio. Date cuenta que muchos desarrollos se hacen para aplicaciones monousuario, y dado que la pregunta no indica que sea un caso diferente, simplemente lo he asumido asi. De hecho, para una aplicación cliente, donde la base de datos está corriendo en otro servidor, la formula proporcionada no serviria de nada, pues el cliente de interbase no puede acceder a la base de datos con la dirección unc del archivo que la contiene. La cadena de conexión, en estos casos, depende del protocolo usado. En tcp-ip, sería algo como:

En el caso de windows, usando el nombre del servidor:
servidor:c:\ruta\base.fdb
usando ip:
192.168.0.42:c:\ruta\base.fdb

En el caso de linux...

servidor:/usr/firebird/bases/base.gdb
o bien
192.168.0.42:/usr/firebird/bases/base.gdb


El código tambien asume que tanto el servidor de base de datos FireBird como el aplicativo se encuentran en la misma máquina. De llegar a estar en máquinas diferente el código no funcionaría. Es Así o estoy errado?

Totalmente correcto.

Hasta luego.

;)

verm83
08-03-2004, 23:44:06
Buenas, que respondo.
Todo correcto lo que comentáis. La aplicación que estoy programando es mi proyecto de fin de estudios, la cual acompañaré con un instalador de Firebird, y todo detallado, con lo que, en caso de no existir éste en el pc cliente, se instalaría junto con la aplicación. Igualmente, la base de datos estará en la carpeta de instalación, por lo que he obviado la ip / puerto.
He de decir que llevo programando en Delphi apenas un par de meses, y hay muchas cosas que las tengo en desconocimiento, poco a poco cogeré práctica.

Saludos y gracias por los consejos.

orodriguezc
09-03-2004, 00:05:09
Gracias Jachguate y verm83. Muy claras y logicas sus explicaciones. Ahora si entendi. Hasta luego.