Ir al contenido



Foto

Como compilar aplicacion para conectarla dinamicamente


  • Por favor identifícate para responder
16 respuestas en este tema

#1 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 468 mensajes

Escrito 03 agosto 2015 - 07:26

Ya es un tema muy conocido lo de el archivo .INI donde estan los datos de la conexion nombre y pass de usuario etc.. tanto en el server como en el cliente con el componente TSQLConnection.

 

Pero el caso es que quiero saber como se debe compilar ambas aplicaciones, lo logico seria compilar el componente desconectado para que tome parametros al conectarse. Pero de esta manera falla la aplicacion(ambas).

 

Y obtengo ademas Remote Error: Missing drivername property (esta viene del .INI).

 

Ya me paso que compilando con mi ip por ej. al llevar a otra maquina toma esa y no la del .INI (como que fuera estatico).

GRacias.


  • 0

#2 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 528 mensajes
  • LocationCali, Colombia

Escrito 03 agosto 2015 - 08:49

Usualmente el componente TSqlConnection debe estar desconectado y en el DataModulo o los formularios inicales que se autocreen todos los componentes SqlQuery o cualquier otro que esté conectado al TSqlConnection debe estar inactivo   Active=False.

 

Es común que cuando se trabaja en una aplicación, y si se crean campos de referencias, los queries queden abiertos por defecto.    Así que asegúrate que todo esté cerrado, incluyendo el SQLConnection.

 

 

Creo que eso arreglaría tu problema.

 

Saludos.


  • 0

#3 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 mensajes
  • LocationMar del Plata / Bs As / Argentina

Escrito 03 agosto 2015 - 09:16


php
  1. procedure Tmodulo.DataModuleCreate(Sender: TObject);
  2. Var BaseDeDatos: String;
  3. IniFile: TIniFile;
  4. begin
  5. {TOMO DATOS DEL ARCHIVO INI}
  6. IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'inicio.ini');
  7. BasedeDatos := IniFile.ReadString('BD','Path','');
  8. puerto := IniFile.ReadString('PORT','puerto','');
  9. hay_ifiscal := IniFile.ReadString('ifiscal','valor','');
  10. with IBConnection1 do
  11. begin
  12. DatabaseName:= BasedeDatos;
  13. password := 'masterkey';
  14. username:= 'SYSDBA';
  15. Connected:= True;
  16. sqlTransaction1.Active:= True;
  17. end;


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.130 mensajes
  • LocationMéxico

Escrito 03 agosto 2015 - 09:19

Hola 

 

Otra cosa que necesitas tener en consideración es que el DataModule sea la primer forma que se crea, y todas las conexiones se configuren en el evento OnCreate de la misma, con eso resuelto, ya puedes abrir cualquier otra forma y la conexión con la base de datos.

 

Saludos

 

Edito: Así como lo muestra nuestro buen  amigo Nikolas (y)


  • 0

#5 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 468 mensajes

Escrito 03 agosto 2015 - 11:02

Y se podria lanzar una excepcion(un cartelito), en xp te dice ".exe dejo de funcionar", aunque windows 7 te tira el error ekeje


  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.130 mensajes
  • LocationMéxico

Escrito 03 agosto 2015 - 11:35

Y se podria lanzar una excepcion(un cartelito), en xp te dice ".exe dejo de funcionar", aunque windows 7 te tira el error ekeje

 

Una excepción ¿Cuando?

 

Puedes utilizar un try...except, sólo tienes que definir en que momento quieres lanzar la excepción.

 

Saludos


  • 0

#7 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 468 mensajes

Escrito 12 agosto 2015 - 11:14

De hecho utilizo try except porque los parametros se cargan del INI, pero si el server no esta iniciado o algun dato esta mal? en windows me dice:

 

http://s1187.photobu...90ybqt.jpg.html

 

Sin embargo si conecto el servidor y este se inicia no hay errores.


delphi
  1. procedure TClientModule1.DataModuleCreate(Sender: TObject);
  2. var
  3. admin:TIniFile;
  4. nombre,destino,hoy,hoycli,hoycat,hoysubcat:string;
  5. i,x:integer;
  6. ultimo,ucat,usubcat,ucli:string;
  7. fecha:TDateTime;
  8. begin
  9.  
  10. admin:=TIniFile.Create(ExtractFilePath(Application.ExeName )+ 'caja.ini');
  11. hoy:=ExtractFilePath(Application.ExeName)+ 'productos\'+FormatDateTime('dd-mm-yyyy',Now) + 'producto.xml';
  12. hoycli:=ExtractFilePath(Application.ExeName)+ 'clientes\'+FormatDateTime('dd-mm-yyyy',Now) + 'clientes.xml';
  13. hoycat:=ExtractFilePath(Application.ExeName)+ 'cat\'+'catprod'+FormatDateTime('dd-mm-yyyy',Now) + '.xml';
  14. hoysubcat:=ExtractFilePath(Application.ExeName)+ 'cat\'+'subcatprod'+FormatDateTime('dd-mm-yyyy',Now) + '.xml';
  15. with ClientModule1.SQLConnection1 do
  16. begin
  17. Close;
  18. DriverName:='DataSnap';
  19. Params.Values['DriverName']:=admin.ReadString('admin','DriverName','');
  20. Params.Values['HostName']:=admin.ReadString('admin','HostName','');
  21.  
  22. Params.Values['Port']:=admin.ReadString('admin','Port','211');
  23. Params.Values['DSAuthenticationUser']:=admin.ReadString('admin','User','');
  24. Params.Values['DSAuthenticationPassword']:=admin.ReadString('admin','Pass','');
  25. Params.Values['DSAuthenticationScheme']:=admin.ReadString('admin','bd','');
  26.  
  27. end;
  28. try
  29. SQLConnection1.Open;
  30. except
  31.  
  32. ShowMessage('trabajando sin conexion');
  33. end;

Pero no funciona..

Gracias por su ayuda..


  • 0

#8 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 468 mensajes

Escrito 18 agosto 2015 - 04:14

Bueno al final coloque un TTimer en el form principal, y el codigo de arriba(en el que leo el archivo :INI y realizo la conexion) lo coloque en el evento ONTimer del Timer, entonces la aplicacion deberia mostrar todos sus formulario aunque el Clientmodule no se haya podido conectar.

 

El caso es que obtengo un error y todo sigue igual en la linea inherited del constructor del datamodule:


delphi
  1. constructor TClientModule1.Create(AOwner: TComponent);
  2. begin
  3. inherited;
  4. FInstanceOwner := True;
  5. end;

Haciendo debug me da el socket error connection refused en "inherited" y es lo mismo que nada.

 

Agradeceria me ayuden.


  • 0

#9 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 18 agosto 2015 - 08:50

Hola.

 

El componente TSQLConnection tiene un evento OnBeforeConnect

 

Establece los parámetros de la conexión dentro de ese evento, de esta forma la conexión se abrirá siempre con los parámetros adecuados.

 

Saludos


  • 0

#10 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 468 mensajes

Escrito 18 agosto 2015 - 11:21

Entiendo, pero si los parametros son incorrectos? en que parte puedo tratar de conectarme o continuar en la aplciacion?


  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.130 mensajes
  • LocationMéxico

Escrito 18 agosto 2015 - 11:29

Entiendo, pero si los parametros son incorrectos? en que parte puedo tratar de conectarme o continuar en la aplciacion?

 

 

Bueno, si los parámetros fuesen incorrectos, se nos presenta una disyuntiva, pensar que es un intento de intromisión sin permiso o tener los parámetros correctos dentro del código y asignarlos en caso de error.

 

Yo soy un poco paranoico, por lo que no dejaría pasar a nadie si no se tienen los datos de conexión y mostrar un mensaje para que se asignen los parámetros correctos.

 

Pero como no soy yo y solo tu puedes determinar la lógica que deberá seguir tu aplicación.

 

Saludos


  • 0

#12 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 468 mensajes

Escrito 18 agosto 2015 - 11:46

los archivos vienen de un .INI. Pero el caso es que si son incorrectos la aplicacion no abre.

Ya probe colocar en el oncreate del main un SqlConnection.Open, y luego el beforeconnect como decia Marc,:


  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.130 mensajes
  • LocationMéxico

Escrito 18 agosto 2015 - 11:54

los archivos vienen de un .INI. Pero el caso es que si son incorrectos la aplicacion no abre.

Ya probe colocar en el oncreate del main un SqlConnection.Open, y luego el beforeconnect como decia Marc,:

 

 

No abre porque está generando una excepción antes de iniciar la unidad principal, por eso en un mensaje anterior te recomendé hacer uso de un bloque try-except para que en caso de error no se aborte la aplicación sino que tu decidas que hacer en caso de un error como ese.

 

Saludos


  • 0

#14 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 19 agosto 2015 - 04:05

Hola.

 

Personalmente no encontré solución a este problema (aunque tengo que admitir que hace muchos años que no he vuelto a mirarlo).

 

Así que simplemente después de crear el DataModule, miro si la conexión está abierta, y en ese caso muestro un mensaje de Error de que la aplicación es una versión de desarrollo.

 

De esta forma me aseguro de que la conexión esté cerrada en la versión que llega a los clientes, de forma que se abre por código en un Cn.Open, donde se pueden poner los parámetros correctos de la conexión en su BeforeConnect.

 

Creo que la única solución definitiva para este problema sería interceptar la carga del archivo .DFM, de forma que cuando lea la propiedad .Connected la pongamos manualmente a falso aunque en el archivo .DFM esté a cierto (en realidad esto no es suficiente, los Datasets dependientes de esa conexión también deben forzarse a su propiedad Active a False, puesto que en caso contrario abrirían la conexión, aunque ya esté definida con Connected a False).

 

Pero nunca lo he llevado a la práctica y he programado esa intercepción.


  • 0

#15 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 19 agosto 2015 - 04:12

No abre porque está generando una excepción antes de iniciar la unidad principal, por eso en un mensaje anterior te recomendé hacer uso de un bloque try-except para que en caso de error no se aborte la aplicación sino que tu decidas que hacer en caso de un error como ese.

 

Saludos

 

El problema es que si la conexión está guardada con la propiedad Connected a True, entonces se abrirá cuando el módulo carga las propiedades del DFM. De forma que se ejecuta sin que pueda ser encpasulado en un bloque try ... except, o sin disparar eventos como el OnBeforeConnect.

 

NOTA: Ni siquiera hace falta que la propiedad Connected esté a True. Solo con que alguno de sus Datasets relacionados estén con la propiedad Active a True entonces la carga del DFM ya abrirá esa conexión sin forma de que pueda ser controlado por código.


  • 0

#16 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 468 mensajes

Escrito 19 agosto 2015 - 11:04

Volvi a colocar todo el codigo en el datamodule... y desactive todos los tclientdataset y el tsqlconnection, tal como lo tenia antes, pero con todo desactivado:

 

dentro del try si se abre la conexion:


delphi
  1. for i := 0 to ComponentCount -1 do
  2. begin
  3. if Components[i] is TClientDataSet then
  4. begin
  5. TClientDataSet(Components[i]).Active :=True;
  6. TClientDataSet(Components[i]).Open;
  7. end;
  8. end; 

de lo contrario hago loadfromfile de los dataSETS..

 

Gracias!1


  • 0

#17 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 19 agosto 2015 - 12:14

Active := True y Open son sinonimos

 

Interceptar el evento OnCreate del DataModule y seteando la conexion a False no soluciona el problema?


  • 0