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)
-   -   conexion a Firebird (https://www.clubdelphi.com/foros/showthread.php?t=75308)

pmtzg 12-08-2011 09:01:35

conexion a Firebird
 
hola amigos tengo el siguiente dilema

en una pequeña aplicacion tengo form1 y 1 datamodule llamados Dmdatos

si desde el form1 creao mando crear una base de datos me marcaba error

bueno pues puse el IBDatabase en el form1 y ya pude crear la base

pero si la deseo crear desde el form1 hasta el data module me tira el error de:

Código Delphi [-]
Access violation at adress  005cab7b in module  programa.exe read of  addresss 00000074

y ade ahi ya no paso

pero bueno si creo la base desde form1 como dije la crea sin problema pero ahora si deso abrir la misma base de datos ya creada me vuelve a sacar el mismo error

codigo para abrir base de datos ya creada :
me arroja el error desde la primera linea IBDatabase1.params.clear

es un procedure que lo mando llamar desde el form1
Código Delphi [-]
DmDatos.open_bdfb;

Código Delphi [-]
procedure TDmDatos.open_bdfb;                         { ABRE LA BD DATOS FIREBIRD}
begin
  IBDatabase1.Params.Clear;
  IBDatabase1.DatabaseName:=RutaBdFb;
  IBDatabase1.Params.Add('user_name=SYSDBA');
  IBDatabase1.Params.Add('password=masterkey');
  IBDatabase1.DefaultTransaction:=IBTran1;
  IBTran1.DefaultDatabase:=IBDatabase1;
  if not IBDatabase1.Connected then
    begin
      IBDatabase1.Connected:=true;
      IBDatabase1.Open;
    end;

  if not IBTran1.Active then
      IBTran1.Active:=true;

end;

me pueden hechar una manita

uso delphi 2007, firebird 2.1 y acceso con IBdatabase de interbase
la variable ruta tiene la ruta exacta donde crear

repito este codigo no me funciona en el datamodule pero si lo copia y lo hago desde el form1 si corre

gracias

duilioisola 12-08-2011 09:47:12

Cita:

este codigo no me funciona en el datamodule pero si lo copia y lo hago desde el form1 si corre
Esto parece indicar que además de mover el código, deberás mover los componentes a los que hace referencia
- IBDataBase1
- IBTran1

Supongo que luego, las tablas que tiren de esta base, también deberás apuntarlas a DmDatos.IBDataBase1

ecfisa 12-08-2011 10:02:57

Hola.

Pone el TDataModule en Autocreate-forms y de esta forma te tiene que conectar. (Siempre que sean correctas la ruta y la contraseña)
Código Delphi [-]
...
implementation 
{$R *.dfm}

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  IBDatabase1.DatabaseName:= RutaBdFb;
  IBDatabase1.LoginPrompt:= False;
  IBDatabase1.Params.Clear;
  IBDatabase1.Params.Add('user_name=sysdba');
  IBDatabase1.Params.Add('password=masterkey');
  try
    IBDatabase1.Open;
    IBTransaction1.DefaultDatabase:= IBDatabase1;
    IBTransaction1.Active:= True
  except
    raise Exception.Create('No se puede establecer la conexión con la base de datos');
    Application.Terminate
  end
end;

procedure TDataModule1.DataModuleDestroy(Sender: TObject);
begin
  if IBDatabase1.TestConnected then
    IBTransaction1.Commit
end;
end.

Saludos.

pmtzg 12-08-2011 17:03:26

no puedo crear ni abrir base de datos Fb desde datamodule
 
Gracias a todos por sus comentarios

mi pregunta es la siguiente:

¿ que estoy haciendo mal ?

por que no puedo crear mi base de datos desde mi datamodule

y por lo mismo , por que no puedo abrirla


ese es mi problema , !!!!!!!!!!!!!!!!!!!!!!????????

una orientadita amigo quiza omiti algo que no lo vizualizo

ecfisa 12-08-2011 20:54:32

Hola pmtzg.


Cita:

por que no puedo crear mi base de datos desde mi datamodule
Ahora que reparo en lo que comentás arriba, a ver si te estoy interpretando mal...

Previamente a intentar conectarte, ¿ Estas haciendo algo como
Código Delphi [-]
var
  IBDatabase1: TIBDatabase;
begin
  IBDatabase1:= TIBDatabase.Create(Self);
  ....
end;
?

Saludos.

pmtzg 12-08-2011 21:52:50

hola mi estimado eficsa

en mi data module lo tengo asi:
Código Delphi [-]
procedure TDmDatos.open_bdfb;                         { ABRE LA BD DATOS FIREBIRD}
begin
  IBDatabase1.Params.Clear;
  IBDatabase1.DatabaseName:=RutaBdFb;
  IBDatabase1.Params.Add('user_name=SYSDBA');
  IBDatabase1.Params.Add('password=masterkey');
  IBDatabase1.DefaultTransaction:=IBTran1;
  IBTran1.DefaultDatabase:=IBDatabase1;
  if not IBDatabase1.Connected then
    begin
      IBDatabase1.Connected:=true;
      IBDatabase1.Open;
    end;

  if not IBTran1.Active then
      IBTran1.Active:=true;

end;


y desde otro form por decir form1, lo ejecuto asi:
Código Delphi [-]
DmDatos.open_bdfb;


y me manda el error que aqui describo, eso es en principio para crear no puedo error y si lo creo de otra forma por decir desde un form1 si medeja

ahora bien si desde el Datamodule deseo abrir como lo describo arriba no me deja me lanza error

espero poder darme a entender

saludos

ecfisa 12-08-2011 22:37:11

Hola.

Cuando reemplacé por tu código también me generó error.
Le hice unas modificaciones que verás comparándolo con el original y me funciona correctamente.
Código Delphi [-]
procedure TDMDatos.Open_bdfb;
begin
  IBDatabase1.DatabaseName:=RutaBdFb;
  IBDatabase1.LoginPrompt:= False;  // login desactivado
  IBDatabase1.Params.Clear;
  IBDatabase1.Params.Add('user_name=SYSDBA');
  IBDatabase1.Params.Add('password=masterkey');
  if not IBDatabase1.Connected then
  begin
      //IBDatabase1.Connected:=true; (Debajo haces Open)
     IBDatabase1.Open;
     IBTransaction1.DefaultDatabase:=IBDatabase1;
  end;
  if not IBTransaction1.Active then
    IBTransaction1.Active:=true;
end;

La llamada con que probe:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  DMDatos.Open_bdfb;
  if DMDatos.IBDatabase1.TestConnected then
    ShowMessage('Conectado correctamente');
end;

Saludos.

Caral 12-08-2011 22:41:18

Hola
No entiendo, se esta creando un base de datos o accediendo a ella?.
Saludos

pmtzg 12-08-2011 23:23:40

se esta creando y despues se usara

lo probare y ya te contare amigo

pmtzg 13-08-2011 07:24:09

ya se lo que pasa les cuento

mi amigo ecfisa me hizo unas pruebas que posteriormente yo las realize y ok

pero el error me sale cuando entra el Form

los procesos que mando llamar los ponto en :


Formpaint o FormCreate

para que se autoejecuten es ahi cuando me manda el error
si mando crear la base de datos desde mi DAtaModule

pero si lo hago igual y pongo ibdatabase en el form1 no me marca error


hay alguna manera para que mis procesos que estan en mi datamodulo
los ejecute desde otro form en forma automatica colocando los procedure
en el FormPaint sin q me marque error ????


es decir

Código Delphi [-]
form1.Formpaintprocedure TForm2.FormPaint(Sender: TObject);
begin

  datamodule.crea_base_datos;    {cuando lo ejecuto asi me marca error}

end;

ecfisa 13-08-2011 22:27:51

Hola pmtzg.

Cita:

hay alguna manera para que mis procesos que estan en mi datamodulo los ejecute desde otro form en forma automatica colocando los procedure en el FormPaint sin q me marque error?
El problema es que al invocar el procedimiento:datamodule.crea_base_datos en el evento OnPaint del form, será llamado cada vez que el form necesite repintarse.
Para que compruebes esto:
DataModule:
Código Delphi [-]
procedure TDMDatos.Open_bdfb;
begin
  IBDatabase1.DatabaseName:=RutaBdFb;
  IBDatabase1.LoginPrompt:= False;  // login desactivado
  IBDatabase1.Params.Clear;
  IBDatabase1.Params.Add('user_name=SYSDBA');
  IBDatabase1.Params.Add('password=masterkey');
  if not IBDatabase1.Connected then
  begin
      //IBDatabase1.Connected:=true; (Debajo haces Open)
     IBDatabase1.Open;
     IBTransaction1.DefaultDatabase:=IBDatabase1;
  end;
  if not IBTransaction1.Active then
    IBTransaction1.Active:=true;
end;

Form invocador: (agrega un TEdit y un TButton)
Código Delphi [-]
...
procedure TForm1.FormPaint(Sender: TObject); 
begin
  DMDatos.Open_bdfb;
  if DMDatos.IBDatabase1.TestConnected then
    ShowMessage('Conectado correctamente')
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Visible:= not Edit1.Visible;
end;
...
Al abrir el form muestra: "Conectado correctamente", al primer click sobre el botón te va a mostrar: "No es posible realizar la operacion -- La Base de Datos está actualmente abierta". Y si cambias de ventana y volves al form, vas a ver el cartel de error en cascada tantas veces como lo hagas, ya que el form se repinta y el evento OnPaint es disparado.

En el caso de que llames a la función DMDatos.Open_bdfb desde el evento OnCreate del form, asegurate de que en el órden de creación esté primero DMDatos (Project-> Options ->Auto-create forms) . De no ser así, vas a recibir un error de EAccesViolation ya que al invocar el procedimiento Open_bdfb, en el evento OnCreate del form invocador, DMDatos aún no ha sido creado.

Saludos.


La franja horaria es GMT +2. Ahora son las 16:20:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi