PDA

Ver la Versión Completa : conexion a Firebird


pmtzg
12-08-2011, 09:01:35
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:

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

DmDatos.open_bdfb;




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
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)

...
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
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.


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

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:

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:

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.

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:

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


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.

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:

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)

...
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.