Ir al contenido


Foto

Conexión Remota o Local - AdoConnection - DataModule


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

#1 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 142 mensajes
  • LocationMéxico

Escrito 23 septiembre 2017 - 09:41

Buenos dias, tengo un detalle que es primera vez que hago y ver si me pueden ayudar.

 

Tengo un formulario donde deseo seleccionar que tipo de conexión voy atener, sea remoto (una ip vpn) o local (mismo equipo).

 

Dentro de la Opciones del proyecto, en formularios solo tengo lo siguiente.. Unit del sistema


delphi
  1. Splash_Form := TSplash_Form.Create(Application);
  2. Splash_Form.Show;
  3. Splash_Form.Update;
  4.  
  5. while Splash_Form.Timer1.Enabled do
  6. Application.ProcessMessages;
  7.  
  8. Application.Initialize;
  9. Application.Title := 'Control de sistemas';
  10. Application.CreateForm(TFrmConexion, FrmConexion);
  11. Application.CreateForm(TDMod1, DMod1);
  12. Application.CreateForm(TMain, Main);
  13. Splash_Form.Hide;
  14. Splash_Form.Free;
  15. Application.Run;

En el formulario que hará la conexión tengo lo siguiente ..

 

Al darle click a un RadioGroup el siguiente código..


delphi
  1. If Opciones.ItemIndex = 0 then
  2. begin
  3. TipoLogin:= 'LOCAL';
  4. end
  5. else
  6. TipoLogin := 'REMOTO';
  7.  
  8. // Condiciones de Conexiones
  9.  
  10. if TipoLogin = 'LOCAL' then
  11. begin
  12. // DMod1:= TDMod1.Create(self);
  13. // -------------------------------
  14. FLogin:= TFLogin.Create(self); // Crear Fomulario
  15. try
  16. FLogin.ShowModal; // Visualiza en forma Modal
  17. finally
  18. FreeAndNil(FLogin); // Libera el Formulario
  19. end;
  20. end;

En el formulario FLogin, alli es donde se activa el ADOConnection para tener conexión ala Base de Datos. Pero note que el DataModule donde esta ese componente y las tablas, se activan antes del FLoginy no puedo editar el ConnectionString.

 

Mi idea es poner el siguiente código en el evento CREATE del DataModule para asi asignar donde va conectarse la base de datos..


delphi
  1. if opt = 'LOCAL' then
  2. begin
  3. ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Password=123456;Persist Security Info=True;User ' +
  4. 'ID=uca;Data Source=uca_local;Initial Catalog=uca';
  5. ADOConnection1.ConnectionTimeout:= 2800000;
  6. ADOConnection1.DefaultDatabase:='uca';
  7. ADOConnection1.LoginPrompt:= False;
  8. ADOConnection1.Provider:='MSDASQL.1';
  9. end;
  10.  
  11. if opt = 'REMOTO' then
  12. begin
  13. ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Password=123456;Persist Security Info=True;User ' +
  14. 'ID=uca_server;Data Source=uca_server;Initial Catalog=uca';
  15. ADOConnection1.ConnectionTimeout:= 2800000;
  16. ADOConnection1.DefaultDatabase:='uca_server';
  17. ADOConnection1.LoginPrompt:= False;
  18. ADOConnection1.Provider:='MSDASQL.1';
  19. end;

La variable 'opt' es una variable global donde se le da el valor cuando se selecciona en el formulario conexión el tipo de conexión que se va usar.

 

De ali no se como hacerle para que cuando pulse click ene el formulario para elegir el tipo de conexión, en el data modulo pueda cambiar la ruta de conexión.

 

Intenté crear el formulario DataModule, para que se cumpliera el evento CREATE de este, pero no supe como hacerlo.

 

No se si hast a lli voy bien o me falte algo mas ...

 

Saludos ..


  • 0

#2 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 23 septiembre 2017 - 11:12

Nunca trabaje con ADO. Siempre con BDE o Zeos. Pero para mostrar las opciones local o remoto debes mostrar el form y para eso debes crearlo. Osea que el proceso de conectar debe realizarse despues:

 

Yo hago asi(conecto y activo dataset):


delphi
  1. procedure TMODULODATOS.DataModuleCreate(Sender: TObject);
  2.  
  3. var
  4. admin:TIniFile;
  5. i,x:integer;
  6. fecha:TDateTime;
  7.  
  8. begin
  9.  
  10. admin:=TIniFile.Create(ExtractFilePath(Application.ExeName )+ 'caja.ini');
  11.  
  12. with CONEXION do
  13. begin
  14. Close;
  15. DriverName:='MYSQL';
  16. Params.Values['DriverName']:=admin.ReadString('admin','DriverName','');
  17. Params.Values['HostName']:=admin.ReadString('admin','HostName','');
  18. Params.Values['DataBase']:=admin.ReadString('admin','bd','');
  19. Params.Values['User_Name']:=admin.ReadString('admin','User','');
  20. Params.Values['Password']:=admin.ReadString('admin','Pass','');
  21.  
  22. end;
  23. try
  24. CONEXION.Open;
  25.  
  26.  
  27. finally
  28. begin
  29.  
  30. if MODULODATOS.CONEXION.Connected then
  31. begin
  32.  
  33. for i := 0 to ComponentCount -1 do
  34. begin
  35. if Components[i] is TSQLTable then
  36. begin
  37. TSQLTable(Components[i]).Active :=True;
  38.  
  39. end;
  40. if Components[i] is TClientDataSet then
  41. begin
  42. TClientDataSet(Components[i]).Active :=True;
  43.  
  44. end;
  45. end;
  46. end
  47. else
  48. begin
  49.  
  50. ShowMessage('trabajando sin conexion');
  51. end;
  52.  
  53. end;
  54. end;
  55. end;

en el evento oncreate..pero en tu caso hazlo despues al seleccionar o hacer click en un boton...

1-]Asigna los parametros segun local o global..

                para esto puedes usar un .ini o el mismo form

2-Intenta conectar con try except.


  • 0

#3 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 142 mensajes
  • LocationMéxico

Escrito 23 septiembre 2017 - 12:08

Nunca trabaje con ADO. Siempre con BDE o Zeos. Pero para mostrar las opciones local o remoto debes mostrar el form y para eso debes crearlo. Osea que el proceso de conectar debe realizarse despues:

 

Yo hago asi(conecto y activo dataset):


delphi
  1. procedure TMODULODATOS.DataModuleCreate(Sender: TObject);
  2.  
  3. var
  4. admin:TIniFile;
  5. i,x:integer;
  6. fecha:TDateTime;
  7.  
  8. begin
  9.  
  10. admin:=TIniFile.Create(ExtractFilePath(Application.ExeName )+ 'caja.ini');
  11.  
  12. with CONEXION do
  13. begin
  14. Close;
  15. DriverName:='MYSQL';
  16. Params.Values['DriverName']:=admin.ReadString('admin','DriverName','');
  17. Params.Values['HostName']:=admin.ReadString('admin','HostName','');
  18. Params.Values['DataBase']:=admin.ReadString('admin','bd','');
  19. Params.Values['User_Name']:=admin.ReadString('admin','User','');
  20. Params.Values['Password']:=admin.ReadString('admin','Pass','');
  21.  
  22. end;
  23. try
  24. CONEXION.Open;
  25.  
  26.  
  27. finally
  28. begin
  29.  
  30. if MODULODATOS.CONEXION.Connected then
  31. begin
  32.  
  33. for i := 0 to ComponentCount -1 do
  34. begin
  35. if Components[i] is TSQLTable then
  36. begin
  37. TSQLTable(Components[i]).Active :=True;
  38.  
  39. end;
  40. if Components[i] is TClientDataSet then
  41. begin
  42. TClientDataSet(Components[i]).Active :=True;
  43.  
  44. end;
  45. end;
  46. end
  47. else
  48. begin
  49.  
  50. ShowMessage('trabajando sin conexion');
  51. end;
  52.  
  53. end;
  54. end;
  55. end;

en el evento oncreate..pero en tu caso hazlo despues al seleccionar o hacer click en un boton...

1-]Asigna los parametros segun local o global..

                para esto puedes usar un .ini o el mismo form

2-Intenta conectar con try except.

 

Pero mi duda es, el DataModule debe crearse al inicio o lo mando a crear después de seleccionar el tipo de conexion.? si lo mando a crear, como sería el llamado?

DMod1:= TDMod1.Create(self);  ???


  • 1

#4 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 23 septiembre 2017 - 01:21

Pero mi duda es, el DataModule debe crearse al inicio o lo mando a crear después de seleccionar el tipo de conexion.? si lo mando a crear, como sería el llamado?
DMod1:= TDMod1.Create(self); ???

El datamodule es como un form..si haces click en viewsource del .exe vera que se crea al iniciar la aplicacion..no puede no crearse

Enviado desde mi SM-G530M mediante Tapatalk
  • 0

#5 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 23 septiembre 2017 - 10:55

Una alternativa es poner un manejador en el evento BeforeConnect del componente Connection. Aca podes realizar toda las asignaciones de parametros pertinentes, cuando este manejador termine, se va conectar con estos parametros que hayas indicado

 

De todos modos te recomiendo que limpies el codigo porque tenes muchas cosas repetidas, segun lo que muestras, los parametros de conexion si es local o remota son practicamente lo mismo (de hecho, lo unico que suele variar es la direccion ip/host al que te conectas y el puerto)


  • 1

#6 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 142 mensajes
  • LocationMéxico

Escrito 24 septiembre 2017 - 02:25

En el evento click del radiogroup del formulario FrmConexion, tengo lo siguiente:


delphi
  1. FrmConexion.Visible := False;
  2.  
  3. // -----------------------
  4. // Opciones de Conexión
  5. // -----------------------
  6.  
  7. If Opciones.ItemIndex = 0 then
  8. begin
  9. TipoLogin:= 'LOCAL';
  10. end
  11. else
  12. TipoLogin := 'REMOTO';
  13.  
  14. // --------------------------
  15. // ------------------------------- }
  16. DMod1 := TDMod1.Create(self);
  17. FLogin:= TFLogin.Create(self); // Crear Fomulario
  18. try
  19. FLogin.ShowModal; // Visualiza en forma Modal
  20. finally
  21. FreeAndNil(FLogin); // Libera el Formulario
  22. end;

Quité en Formlario DataModule del Unit Principal y solo quedo..


delphi
  1. Splash_Form := TSplash_Form.Create(Application);
  2. Splash_Form.Show;
  3. Splash_Form.Update;
  4.  
  5. while Splash_Form.Timer1.Enabled do
  6. Application.ProcessMessages;
  7.  
  8. Application.Initialize;
  9. Application.Title := 'Control para Sistemas';
  10. Application.CreateForm(TFrmConexion, FrmConexion);
  11. Application.CreateForm(TMain, Main);
  12. Splash_Form.Hide;
  13. Splash_Form.Free;
  14. Application.Run;

En el formulario DataModule, del evento OnCreate, tengo esto:


delphi
  1. procedure TDMod1.DataModuleCreate(Sender: TObject);
  2. Var
  3.   MSG : string;
  4.   i   :integer;
  5. begin
  6.  
  7.     try
  8.     ADOConnection1.LoginPrompt := False;
  9.     ADOConnection1.Connected:= True;
  10.     ADOConnection1.Open;
  11.     //
  12.     // ---- ABRIMOS TABLAS ----
  13.     // -----------------------------------
  14.     // -----------------------------------
  15.                 if ADOConnection1.Connected then
  16.                    begin
  17.                      for i := 0 to ComponentCount -1 do
  18.                       begin
  19.                        // --- Verica Estatus de Tabla CLIENTES --
  20.                        if Not TADOQuery(Components[i]).Active Then
  21.                         if Components[i] is TADOQuery then
  22.                           begin
  23.                              try
  24.                                  TADOQuery(Components[i]).Prepared := true;   // Preparamos Tablas
  25.                                  TADOQuery(Components[i]).Active :=True;      // Activamos Tablas
  26.                                except
  27.                                on e: Exception do
  28.                                   begin
  29.                                     // ---------------------------------
  30.                                     if ADOConnection1.InTransaction Then
  31.                                     AdoConnection1.RollbackTrans;
  32.                                     // ---------------------------------
  33.                                     MSG:='Ocurrió un Error Mientras se Conectaba la Base de Datos: ' + E.Message;
  34.                                     Application.MessageBox(PChar(MSG),'ERROR !!!', MB_ICONSTOP );
  35.                                     raise;
  36.                                     Exit;
  37.                                   end;
  38.                              end;
  39.                            end;
  40.                         end;
  41.                     end
  42.                     else
  43.                     begin
  44.                       msError('trabajando sin conexion','Error..');
  45.                     end;
  46.  
  47.     // -------------------------
  48.     // -------------------------
  49.      except
  50.       on E:Exception do
  51.       begin
  52.         // Error
  53.         msError('No se ha podido conectar. Motivo del Error: ' + E.Message,'ERROR');
  54.         ADOConnection1.Close;
  55.         raise;
  56.       end; // except
  57.     end; //
  58.  
  59. end;

En el DataModule, tengo el componente ADOConnecction, en el Evento BeforeConnected, tengo esto:


delphi
  1. if opt = 'LOCAL' then
  2. begin
  3. ADOConnection1.Provider:='MSDASQL.1';
  4. ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Password=123456;Persist Security Info=True;User ' +
  5. 'ID=uca;Data Source=uca_local;Initial Catalog=uca';
  6. ADOConnection1.ConnectionTimeout:= 2800000;
  7. ADOConnection1.DefaultDatabase:='uca';
  8. ADOConnection1.LoginPrompt:= False;
  9. end;
  10.  
  11. if opt = 'REMOTO' then
  12. begin
  13. ADOConnection1.Provider:='MSDASQL.1';
  14. ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Password=123456;' +
  15. 'Persist Security Info=True;User ID=uca;Data Source=uca_server;Initial Catalog=uca';
  16. ADOConnection1.ConnectionTimeout:= 2800000;
  17. ADOConnection1.DefaultDatabase:='uca';
  18. end;

Al ejcutar el programa y darle click en este caso en la opcion LOCAL, em envia el siguiente mensaje:

 

 

---------------------------
Debugger Exception Notification
---------------------------
Project CTRO.exe raised exception class EOleException with message '[Microsoft][Administrador de controladores ODBC] No se encuentra el nombre del origen de datos y no se especificó ningún controlador predeterminado'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------
 

 

Que parte estaré haciendo mal?


  • 0

#7 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 142 mensajes
  • LocationMéxico

Escrito 25 septiembre 2017 - 02:17

Ya quedo ... Me respondo yo mismo !! :ap:

 

Tomando e cuenta todas las opiniones de los compañeros.. realicé esto ..el detalle fue de que ene l formulario Remoto solamente debía de hacer llamado el Formulario Login, en el Formulario Login al ejecutar la conexión, puse el siguiente código en BeforeConnect del componente ADOConnecction del formulario DataModule las condiciones de conexión.


delphi
  1. procedure TDMod1.ADOConnection1BeforeConnect(Sender: TObject);
  2. begin
  3. // *************************
  4. // Si la conexión es Local
  5. // *************************
  6. if FrmConexion.TipoLogin = 'LOCAL' then
  7. begin
  8. ADOConnection1.Provider:='MSDASQL.1';
  9. ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Password=123456;Persist Security Info=True;User ID=uca;Data Source=uca_local;Initial Catalog=uca';
  10. ADOConnection1.DefaultDatabase :='uca';
  11. end;
  12. // *************************
  13. // *************************
  14.  
  15.  
  16. // *************************
  17. // Si la conexión es Remoto
  18. // *************************
  19. if FrmConexion.TipoLogin = 'REMOTO' then
  20. begin
  21. ADOConnection1.Provider:='MSDASQL.1';
  22. ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Password=123456;Persist Security Info=True;User ID=uca;Data Source=uca_remoto;Initial Catalog=uca';
  23. ADOConnection1.DefaultDatabase :='uca';
  24. end;
  25. // *************************
  26. // *************************

Y después en el Evento AfterConnect del mismo componente ADOConneccion lo siguiente:


delphi
  1. procedure TDMod1.ADOConnection1AfterConnect(Sender: TObject);
  2. var i : Integer;
  3. msg : string;
  4. begin
  5. try
  6. ADOConnection1.LoginPrompt := False;
  7. ADOConnection1.Connected:= True;
  8. ADOConnection1.Open;
  9.  
  10. // -----------------------------------
  11. // -----------------------------------
  12. // ---- ABRIMOS TABLAS ----
  13. // -----------------------------------
  14. // -----------------------------------
  15. if ADOConnection1.Connected then
  16. begin
  17. for i := 0 to ComponentCount -1 do
  18. begin
  19. // --- Verica Estatus de Tabla CLIENTES --
  20. if Not TADOQuery(Components[i]).Active Then
  21. if Components[i] is TADOQuery then
  22. begin
  23. try
  24. TADOQuery(Components[i]).Prepared := true; // Preparamos Tablas
  25. TADOQuery(Components[i]).Active :=True; // Activamos Tablas
  26. except
  27. on e: Exception do
  28. begin
  29. // ---------------------------------
  30. if ADOConnection1.InTransaction Then
  31. AdoConnection1.RollbackTrans;
  32. // ---------------------------------
  33. MSG:='Ocurrió un Error Mientras se Conectaba la Base de Datos: ' + E.Message;
  34. Application.MessageBox(PChar(MSG),'ERROR !!!', MB_ICONSTOP );
  35. raise;
  36. Exit;
  37. end;
  38. end;
  39. end;
  40. end;
  41. end
  42. else
  43. begin
  44. msError('Sin conexion','Error..');
  45. end;
  46. // -------------------------
  47. // -------------------------
  48. except
  49. on E:Exception do
  50. begin
  51. // Error
  52. msError('No se ha podido conectar. Motivo del Error: ' + E.Message,'ERROR');
  53. ADOConnection1.Close;
  54. raise;
  55. end; // except
  56. end; //
  57. end;

Nota: La Base de datos está creado en el manejador Mariadb, en un servidor Linux Centos7

 

Y eso sería todo .... se que quizá haya algo mas elegante de hacer, pero por ahora esto corrió perfecto. Si hay alguna sugerencia mejor agradecería los comentarios ..  (y)


  • 1

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 25 septiembre 2017 - 04:30

En adición a la solución, te recomiendo (Que generalmente se recomienda) que el datamodule sea siempre el primero en crearse, SIEMPRE, yo lo haría de la siguiente manera, creas un pequeño form donde seleccionas el tipo de conección la cual lo crearías en el evento OnCreate del datamodule y a partir de ahí haces las conecciones pertinentes.

 

Saludos.


  • 1

#9 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 25 septiembre 2017 - 06:32

El AfterConnect se ejecuta después de que la conexión se establece, por lo tanto no tiene sentido las 3 primeras líneas que pusiste

Además setear Connected a True es equivalente a llamar al método Open
  • 1




IP.Board spam blocked by CleanTalk.