Ir al contenido


Foto

Capturar error MYSQL


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

#1 elrodrix

elrodrix

    Member

  • Miembros
  • PipPip
  • 24 mensajes

Escrito 08 julio 2013 - 07:17

Como puedo capturar este error ? (ERROR 2013 de MYSQL) y lanzar un mensaje en DELPHI en vez de que MYSQL tire un este error.

Imagen Enviada

Utilizo componentes ADO (Adoconnetion, Adostoredproc, datasource).

Mi idea es, en el evento BeforeOpen de cada componente Adostoredproc, capturar ese error (ese error salta cuando apago el router, desconecto el LAN, etc), y enviar un msj en DELPHI.

intenten algo asi

[DELPHI]With AdoConnection1 do
    begin
      if AdoConnection1.State = [stClosed]  then
        begin
          try
            AdoConnection1.Connected:=True;
          except
            on E: Exception do
              begin
                ShowMessage(E.ClassName + ' Ocurrio un error : ' + E.Message);
              end;
          end;
          //raise Exception.Create('ERROR DE CONEXION DE BASE DE DATOS');
        end;
    end;[/DELPHI]

Pero no se trata de preguntar por el estado del AdoConnection (ya que si el componente se conectó a la base de datos correctamente, su STATE sigue siendo CONECTED por mas que apaque el ROUTER/SWITCH o desconecte el LAN).

Entonces mi idea es capturar los posibles errores de perdida de conexion de MYSQL y enviar un mensaje en DELPHI.

Como seria el procedimiento? Gracias y saludos.
  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 08 julio 2013 - 07:49

Buenas,

Cualquier error arrojado por el motor lo vas a poder capturar en un bloque try...except...end; (que para eso está). Una vez capturado el error, ya es cosa tuya el "desgranarlo" para saber qué ha pasado y mostrar el mensaje de error pertinente al usuario.

ADO lo desconozco, pero otros componentes te arrojan en la información el tipo de excepción lanzada, o un código de error u otro mecanismo para poder saber qué ha pasado. Tendrías que investigar por ahí a ver qué trae ADO para esos menesteres.

Saludos
  • 0

#3 elrodrix

elrodrix

    Member

  • Miembros
  • PipPip
  • 24 mensajes

Escrito 08 julio 2013 - 12:12

Listo, pude solucionar este pequeño problema, agregando un TApplicationEvents en el Form Principal y con el siguiente codigo en el evento On Exception

[DELPHI]//procedimiento para capturar las fallas en la perdida de conexion de la base de datos
//agregar ComObj en uses del FORM
procedure TFMain.ApplicationEvents1Exception(Sender: TObject; E: Exception);
var
  EO:EOLEException;
begin
  if E is EOLEException then
  begin
    EO:=EOLEException(E);
    if EO.ErrorCode = -2147467259 then
      //error de conexion (disconnected)
      begin
        try
          try
            DM1.ADOConnection1.Close;
          except;
          end;
          DM1.ADOConnection1.Open;
          ShowMessage('FALLA EN LA CONEXION A LA BASE DE DATOS - Reestableciendo, vuelva a intentar!');
        except
          on E:Exception do
            ShowMessageFmt('FALLA EN LA CONEXION A LA BASE DE DATOS!.  '
            + 'Por favor, intente luego!.'#13'Error message: %s', [E.Message]);
          end;
      end
      else
        ShowMessage(E.Message + ' ' + IntToStr(EO.ErrorCode));
    end
  else
    ShowMessage(E.ClassName + #13 + E.Message);
end;[/DELPHI]

Espero que les sirva. Gracias y Saludos
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 08 julio 2013 - 01:00

No hace falta que añadas el TApplicationEvents. Basta que en el try evalúes el tipo de excepción correcto que regresa el motor. Para ello es fundamental conocer los componentes de acceso que utilizas, como así también con la documentación de SQL a fin de comprobar cuales son el código o número de error al que representan.

En síntesis ese código que expones se puede hacer todo en una. Como he dicho:



delphi
  1. begin
  2. // algo previo que necesites
  3. try
  4.   // algo a hacer y que sea posible de detectar un error
  5. except
  6. on E: EOLEException do
  7.   if E.ErrorCode = -2147467259 then MessageBox('Bla bla');
  8. end;
  9. // código posterior al try si corresponde
  10. end;



Saludos,
  • 0




IP.Board spam blocked by CleanTalk.