Ir al contenido


Foto

Manejo de Errores o Excepciones


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

#21 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 05 agosto 2009 - 09:51

gracias Eduarcol, realmente lo que deseo hacer es que se detenga el programa, mientras con algun mecanismo se trata de establecer de nuevo la conexion y despues de que esta haya sido restablecida, continuar con las rutinas del programa.

He pensado en utilizar algunas de las ideas de los programitas para hacer ping y cuando me de el visto bueno del ping, entonces intentar conectarme a la base de datos de nuevo.

El problema esta en donde detener la ejecucion del programa y poder poner el codigo del ping.

He hecho esto despues de cada open de los querys del form principal y mas o menos funciona bien, ya por lo menos despues de unos click se cierra el programa. La idea es depurarlo y poner la parte de un form que haga el ping o algo asi.



delphi
  1.   procedure TFRMactivasred.Timer1Timer(Sender: TObject);
  2. begin
  3.   dmmonitorenred.zqcentral.Close;
  4.   dmmonitorenred.zqcentral.sql.Clear;
  5.   dmmonitorenred.zqcentral.SQL.add('select * from central left join acmsub on central.csid=acmsub.csid left join evento on central.evento=evento.evento') ;
  6.   dmmonitorenred.zqcentral.SQL.Add('where entradadatos > ' + quotedstr(inttostr(buscentral)));
  7.   dmmonitorenred.zqcentral.SQL.Add('order by entradadatos desc');
  8.   try
  9.     dmmonitorenred.zqcentral.open;
  10.   except
  11.     On e: exception do
  12.     if e.ClassName = 'EZSQLException' then
  13.       begin
  14.         ShowMessage('no hay conexion a la base de datos');
  15.         FRMactivasred.Close;
  16.       end;
  17.   end;
  18.  
  19. if  dmmonitorenred.zqcentralENTRADADATOS.AsInteger > buscentral then
  20.   begin
  21.     with DMmonitorenred do
  22.     FRMactivasred.ListBox1.Items.Add(zqcentralfechan.AsString+ '  ' + zqcentralDETALLE.AsString +'        ' + zqcentralCSID.AsString + '  ' + zqcentralCLIENTES.AsString + '  ' + zqcentralEVENTO.AsString + '  ' + zqcentralDETALLE_1.AsString + '  ' + ' ' +zqcentralTELEFONO.AsString + '                      entradadatos #  '+ zqcentralENTRADADATOS.AsString  );
  23.     FRMactivasred.ListBox1.Items.Add('  ');
  24.     FRMactivasred.ListBox1.TopIndex := -1 + FRMactivasred.ListBox1.Items.Count;
  25.     buscentral:=dmmonitorenred.zqcentralentradadatos.AsInteger;
  26.     dmmonitorenred.zqcentral.Next;
  27.   end;
  28.  
  29.   dmmonitorenred.zqpendientes.Close;
  30.   dmmonitorenred.zqpendientes.SQL.Clear;
  31.   dmmonitorenred.zqpendientes.SQL.Add('select first 1 * from activas ');
  32.   dmmonitorenred.zqpendientes.SQL.Add(' where alarmnum > ' + quotedstr(inttostr(buscar)) );
  33.   dmmonitorenred.zqpendientes.SQL.Add('order by alarmnum desc');
  34.   try
  35.     dmmonitorenred.zqpendientes.Open;
  36.   except
  37.     On e: exception do
  38.     if e.ClassName = 'EZSQLException' then
  39.       begin
  40.         ShowMessage('no hay conexion a la base de datos');
  41.         FRMactivasred.Close;
  42.       end;
  43.   end;
  44.  
  45.   if dmmonitorenred.zqpendientesalarmnum.ASINTEGER  > buscar then
  46.     begin
  47.       dmmonitorenred.zqactivas.Close;
  48.       dmmonitorenred.zqactivas.SQL.Clear;
  49.       dmmonitorenred.zqactivas.SQL.add('select first 100 * from  Activas inner join evento on activas.evento=evento.evento left join acmsub on activas.csid=acmsub.csid ');
  50.       dmmonitorenred.zqactivas.SQL.add(' where completa <> :pcompleta '); //'+ 'COMPLETADA');  //debe ser buscando los que estan pendientes
  51.       dmmonitorenred.zqactivas.SQL.Add('order by alarmnum desc');
  52.       DMmonitorenred.ZQactivas.ParamByName('pcompleta').AsString:='COMPLETADA';
  53.       try
  54.         dmmonitorenred.zqactivas.Open;
  55.       except
  56.         On e: exception do
  57.         if e.ClassName = 'EZSQLException' then
  58.           begin
  59.             ShowMessage('no hay conexion a la base de datos');
  60.             FRMactivasred.Close;
  61.             end;
  62.       end;
  63.     SONIDO.Show;
  64.     buscar:=dmmonitorenred.zqpendientesalarmnum.ASINTEGER;
  65.   End;
  66.   end;








  • 0

#22 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 06 agosto 2009 - 05:14

el ZConnection tiene el evento OnDisconect, podrias mirar alli
  • 0

#23 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 06 agosto 2009 - 10:42

Gracias Eduarcol 
creo que por ahi es que esta la respuesta. Estoy haciendo las pruebas para informar como queda todo
(y)

  • 0

#24 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 07 agosto 2009 - 08:27



delphi
  1. var
  2.   Form1: TForm1;
  3. function IcmpCreateFile : THandle; stdcall; external 'icmp.dll';
  4. function IcmpSendEcho
  5.   (IcmpHandle : THandle; DestinationAddress : integer;
  6.   RequestData : Pointer; RequestSize : Smallint;
  7.   RequestOptions : pointer;
  8.   ReplyBuffer : Pointer;
  9.   ReplySize : DWORD;
  10.   Timeout : DWORD) : DWORD; stdcall; external 'icmp.dll';
  11. implementation
  12.  
  13. {$R *.dfm}
  14.  
  15. procedure TForm1.Timer1Timer(Sender: TObject);
  16. begin
  17.   ZQuery1.Close;
  18.   ZQuery1.SQL.Text:='select first 10 * from activas order by alarmnum';
  19.  
  20.   try
  21.     ZQuery1.Open;
  22.   except
  23.     on E:Exception do
  24.   begin
  25.       ZConnection1.Disconnect;
  26.   end;
  27.   end;
  28.  
  29. end;
  30.  
  31. procedure TForm1.ZConnection1BeforeConnect(Sender: TObject);
  32. begin
  33.   timer1.Enabled:=true;
  34.  
  35. end;
  36.  
  37. procedure TForm1.ZConnection1AfterDisconnect(Sender: TObject);
  38. var
  39. Handle: Integer;
  40. Buffer: array [0..7] of Cardinal;
  41.  
  42. begin
  43.  
  44.   Handle := IcmpCreateFile;
  45.   if Handle = -1 then Exit; // Error interno
  46.   if not LongBool(IcmpSendEcho(Handle, inet_addr(pchar('10.0.0.2')), nil, 0, nil, @Buffer, SizeOf(Buffer),1000)) then
  47.   begin
  48.     MessageDlg ('Imposible realizar la conexión con la BD', mtError, [mbOK], 0);
  49.     CloseHandle(Handle);
  50.     ZConnection1.Disconnect;
  51.   end
  52.   else
  53.     begin
  54.       MessageDlg ('Conexión realizada correctamente', mtInformation, [mbOK], 0);
  55.       ZConnection1.Disconnect;
  56.       ZConnection1.Connected:= True;
  57.     end;
  58. end;



solo hay que poner en el uses Winsock


He encontrado esta funcion y se supone que lo que hace es un ping y funciona casi perfecto. Cuando la base de datos se desconecta por alguna razon me sale el error, presiono ok y cuando vuelve la conexion entra en query de una vez.

Me gustaria saber como funciona esta funcion para poder implementarla en mi programa, ya que la prueba la he realizado en un solo form, pero al ponerla en una aplicacion con data module y varios querys, me da algunos errores.

Espero sus respuestas.



  • 0




IP.Board spam blocked by CleanTalk.