Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   mensaje error db is currently open (https://www.clubdelphi.com/foros/showthread.php?t=81803)

ginesgomezlopez 19-12-2012 23:24:49

mensaje error db is currently open
 
Hola a ver si me podeis ayudar:

Tengo creado una base de datos en interbase, y funciona bien a modo monopuesto, intento hacerlo en red, y que ambos compartan la misma base de datos, cree el siguiente código:

Código Delphi [-]
procedure TDataModule1.DataModuleCreate(Sender: TObject);
Var
     BaseDeDatos: String;
     ElIniFile: TIniFile;
begin
   // Obtiene la ruta y el nombre de la base de datos
   ElIniFile := TIniFile.Create(ExtractFilePath(Application.exename)+'BDatos.ini');
   BasedeDatos := ElIniFile.ReadString('BD','Path','');
   If BasedeDatos = '' then
    ShowMessage('Error al cargar Base de Datos') else
    ibdatabase1.DatabaseName:=BasedeDatos;   // BaseGeneral es el TIbDatabase y le asigno la ruta de la base de datos segun .ini
    ibtablaclientes.Active:=true;
end;

en el archivo BDatos.ini el siguiente:

[DELPHI[BD]
path="192.168.1.34:C:\Maestros1\MAESTRO.IB"][/delphi]

Pero me da el error del encabezado

Cannot perform operation -- db is currently open.


Gracias.

Casimiro Notevi 20-12-2012 00:19:31

En teoría es que estás intentando abrir una base de datos abierta, ciérrala antes.

ginesgomezlopez 20-12-2012 15:10:56

NO creo que sea eso, ya que sí me funciona con un sólo Pc bien, pero al ponerlo en red da el error, como prueba he puesto en el databasename directamente la dirección 192.168.1.34:C:Maestros1\Maestro.Db, pero se automaticamente todas las tablas se me ponen en active=false, y me da el siguiente error:

Unabled to complete network request to host "192.168.1.34:3050"
Falled to establish a conection.
unknowm Win32 error 10060

ecfisa 20-12-2012 15:57:31

Cita:

Empezado por ginesgomezlopez (Mensaje 452203)
NO creo que sea eso, ya que sí me funciona con un sólo Pc bien, pero al ponerlo en red da el error, como prueba he puesto en el databasename directamente la dirección 192.168.1.34:C:Maestros1\Maestro.Db, pero se automaticamente todas las tablas se me ponen en active=false, y me da el siguiente error:

Unabled to complete network request to host "192.168.1.34:3050"
Falled to establish a conection.
unknowm Win32 error 10060

Hola.

¿ Ya le habilitaste a Firebird el puerto 3050 en el firewall del servidor ?

Saludos.

ginesgomezlopez 20-12-2012 22:24:16

Sí le abrí en el Firewall de windows del servidor el puerto 3050 tanto en TCP como en UDP, pero sigue dando el mismo error, estoy usando el interbase 2009 server, en el momento que cambio en el databasename a 192.168.1.31:c:\Maestros1\Maestro.ib, la verdad que no sé qué hacer.

Casimiro Notevi 20-12-2012 22:29:15

¿Has hecho la prueba de lo que te contesté?

Código Delphi [-]
ibdatabase1.Close;
ibdatabase1.DatabaseName:=BasedeDatos; 
ibtablaclientes.Active:=true;

ginesgomezlopez 20-12-2012 22:57:27

Sí probé, pero sale un mensaje diciendo:

ibTablaClientes:Cannot perform this operation on a closed dataset

y sino:

Unabled to complete netword request to host "192.168.1.34:3050"

Casimiro Notevi 20-12-2012 23:00:55

Cita:

Empezado por ginesgomezlopez (Mensaje 452258)
Unabled to complete netword request to host "192.168.1.34:3050"

¿Puedes poner la cadena de conexión que usas?
Y de paso todas los datos que usas para conectar.

ginesgomezlopez 20-12-2012 23:17:57

En Bdatos.ini

Cita:

[BD]
path="192.168.1.34:C:\Maestros1\MAESTRO.IB"

En Delphi:

Código Delphi [-]
procedure TDataModule1.DataModuleCreate(Sender: TObject);
Var
     BaseDeDatos: String;
     ElIniFile: TIniFile;
begin
   // Obtiene la ruta y el nombre de la base de datos
   ElIniFile := TIniFile.Create(ExtractFilePath(Application.exename)+'BDatos.ini');
   BasedeDatos := ElIniFile.ReadString('BD','Path','');
   If BasedeDatos = '' then
    ShowMessage('Error al cargar Base de Datos') else
//    ibdatabase1.Close;
    ibdatabase1.DatabaseName:=BasedeDatos;   // BaseGeneral es el TIbDatabase y le asigno la ruta de la base de datos segun .ini
    ibtablaclientes.Active:=true;
end;
end.


En propiedades del Database1

en Dabatabasename=C:\Maestros1\Maestro.ib

Casimiro Notevi 20-12-2012 23:46:07

¿Qué componentes estás usando?

ginesgomezlopez 21-12-2012 20:59:43

Uso un IbDatabase donde:

Databasename= C:Maestros1\Maestro.ib por que 192.168.1.34:C:\Maestros1\Maestro.ib pone las 14 Tablas en Active=false

DefaultTransaction= IBTransaction1

Uso un IBTransaction1 donde:

DefaultDatabase= IbDatabase1

Uso 14 TIbTables conectados cada uno a su tabla mediante TableName y donde:

Database = IBDatabase1
Transaction = IBTransaction 1

Uso 14 TDatasources conectados cada uno a su tabla mediante su dataset correspondiente.

Casimiro Notevi 21-12-2012 21:56:48

¿Trabajas con tablas?, no es lo más adecuado, aunque ese no sea el tema aquí.

Cita:

Empezado por ginesgomezlopez
Databasename= C:Maestros1\Maestro.ib por que 192.168.1.34:C:\Maestros1\Maestro.ib pone las 14 Tablas en Active=false

Eso no lo entiendo.

Cita:

Empezado por ginesgomezlopez
Uso 14 TDatasources conectados cada uno a su tabla mediante su dataset correspondiente.

Eso tampoco lo entiendo, la tabla es un dataset, ¿cómo dices que está conectada mediante su dataset correspondiente?

ginesgomezlopez 22-12-2012 19:17:17

Bien, vamos a ver, en Ibconsole creo la base de datos, en la cual creo varias tablas, por ejemplo clientes y proveedores, por simplificar, una vez hecho esto, me voy a Delphi y creo un Tdatamodule, al cual inserto:

Cita:

TBDatabase
IBTransaction
IBTable1 (clientes)
IBTable2 (Proveedores)
IBDatasources1 (Clientes)
IBDatasources2 (Proveedores)
Bien, en la propiedad dataset del IBDatasource1, pongo la tabla a la que quiero conectarla que es IbTable1 y así sucesivamente con el resto de tablas.

Esto lo llevo haciendo siempre y programas de miles de líneas y me ha funcionado muy bien, pero siempre en monopuesto, ahora quería dar el salto a utilizarlos en red, y había visto que no había que hacer muchas modificaciones sólo añadirle al directorio donde está la base de datos la dirección IP del servidor, así si en monopuesto estaba en C:\Maestro1\Maestro.Ib, pues añadirle (192.168.1.34) que es la IP del servidor y quedar de esta manera el DatabaseName 192.168.1.34:C:\Maestro1|Maestro.ib) como demuestra el BDdatos.ini, que ya hemos visto anteriormente, y hacerlo mismo en todos los ordenadores clientes.

Éste es mi problema configurarlo y trabjar en red, ya está, la única forma de trabajar que conozco es esta, si hay otra forma de trabajar sin tablas te agradecería me la dijeras.

Gracias por vuestro interés.









Cita:

al

Casimiro Notevi 22-12-2012 19:31:09

Pues siento no poder ayudarte más, sería necesario más información. Realmente lo que hace falta es poder manejar tu ordenador, porque seguro que es alguna tontería el problema.

orodriguezca 02-01-2013 17:10:38

Creo que lo que está ocurriendo es lo siguiente: La aplicación originalmente está funcionando para un solo PC y la base de datos está sobre ese PC. En el modulo de datos el componente de conexión está "alambrado" a esa base de datos y además la conexion ibdatabase1 está abierta en tiempo de diseño. Cada una de las tablas que están asociadas a está conexión también está abierta. La aplicación se compila, se ejecuta y todo funciona a la perfección.

Cuando se modifica la aplicación para funcionar en red se le adiciona el código para que en tiempo de ejecución establezca la conexión a la base de datos:

Código Delphi [-]
 BasedeDatos := ElIniFile.ReadString('BD','Path','');

pero la base de datos sigue abierta en tiempo de diseño, por tanto, cuando se intenta ejecutar la instrucción anterior obtenemos el mensaje: Cannot perform operation -- db is currently open.

Debes cerciorarte que la base de datos esté cerrada en tiempo de diseño, o sino va a intentar conectarse a una base de datos en el PC local tan pronto inicie la aplicación y antes de que se ejecute el código que configura la conexión.

Por otro lado cuando aplicas la sugerencia de casimiro
Código Delphi [-]
ibdatabase1.Close;
ibdatabase1.DatabaseName:=BasedeDatos; 
ibtablaclientes.Active:=true;

El mensaje de error lo obtiene sobre la tabla ibtablaclientes y no sobre la base de datos ibdatabase1. Sugiero que pruebes lo siguiente (verificando previamente que la base de datos no está abierta en tiempo de diseño):
Código Delphi [-]
ibdatabase1.Close;
ibdatabase1.DatabaseName:=BasedeDatos; 
ibdatabase1.open;  //estoy añadiendo esta línea para abrir explicitamente la base de datos
ibtablaclientes.Active:=true;

Quizás esto no solucione definitivamente el problema pero nos puede proporcionar un mensaje de error que nos acerque más a la solución.

ginesgomezlopez 02-01-2013 22:18:20

Efectivamente orodriguezca, la Base de datos estaba abierta, al ejecutar:


Código Delphi [-]
BasedeDatos := ElIniFile.ReadString('BD','Path','');

Por lo que tengo que cerrarla y volverla abrir, tal y como dices, aunque tengo luego que abrir todas las tablas de las que depende la Base de Datos, ya funciona a la perfección,

Muchísimas gracias a tí y a Casimiro, da gusto dar con un foro como éste.

PD. Casimiro dijo que lo siguiente:

Cita:

¿Trabajas con tablas?, no es lo más adecuado, aunque ese no sea el tema aquí.
¿hay otra forma de trabajar más adecuada?.

Gracias.

Casimiro Notevi 02-01-2013 22:34:13

Con querys

ginesgomezlopez 02-01-2013 22:40:27

Me pondré manos a la obra, empezaré a buscar tutoriales y ejemplos, para empezar.

Casimiro Notevi 02-01-2013 22:49:33

Ejemplo,
otro ejemplo
y el mejor libro.

ginesgomezlopez 02-01-2013 23:11:42

Muchas Gracias,


La franja horaria es GMT +2. Ahora son las 00:15:51.

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