Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Cómo controlar errores de llaves foráneas (https://www.clubdelphi.com/foros/showthread.php?t=75034)

marcy 26-07-2011 01:26:17

Cómo controlar errores de llaves foráneas
 
Hola, eestoy trabajando mysql y delphi 7 utilizo componentes ADO, pero quisiera que me apoyaran en cómo puedo controlar errores en delphi, para que en lugar de que me saque de la aplicacion pueda mandar un mensaje de error, por ejemplo, si tengo un registro que hace referencia a otra tabla, si quiero eliminar el registro y alguna tabla le hace referencia no me saque de la aplicacion.

unos amigos me dieron un codigo pero en visual:

On Error GoTo errores
//codigo que debe ejecutar
Exit Sub
errores:
If Err.Number = -2147217900 Then
MsgBox "Llave duplicada"
End If


¿cómo sería algo parecido en delphi?

intenté con este código:

try
alumnos.Delete;
finally
begin
Showmessage('No se puede eliminar el registro');
end;
end;


ecfisa 26-07-2011 05:28:28

Hola marcy y bienvenido a los foros de Club Delphi.

Cita:

intenté con este código:
try
alumnos.Delete;
finally
begin
Showmessage('No se puede eliminar el registro');
end;
end;
Te pongo un equivalente:
Código Delphi [-]
 try
   Alumnos.Delete;
  except
    on E:Exception do
      if E is EDBEngineError then  // detectado por la BDE
        MessageDlg(Format('%s %d',[EDBEngineError(E).Message,
                   EDBEngineError(E).Errors[0].ErrorCode]),mtError,[mbOk],0)
      else if E is EDatabaseError then  // detectado por la VCL
        MessageDlg(E.Message,mtError,[mbOK],0);
  end;
Si también intentaramos obtener el código de error de un servidor SQL por ejemplo Interbase, sería:
Código Delphi [-]
  try
   Alumnos.Delete;
  except
    on E:Exception do
      if E is EIBInterbaseError then    // error Interbase
        MessageDlg(Format('%s %d',[EIBInterbaseError(E).Message,
            EIBInterbaseError(E).IBErrorCode]),mtError,[mbOk],0)
      else if E is EDBEngineError then  // detectado por la BDE
        MessageDlg(Format('%s %d',[EDBEngineError(E).Message,
                   EDBEngineError(E).Errors[0].ErrorCode]),mtError,[mbOk],0)
      else if E is EDatabaseError then  // detectado por la VCL
        MessageDlg(E.Message,mtError,[mbOK],0);
  end;
Lamentablemente no trabajo con MySQL, por lo que no sé de que manera obtener el código del mismo. Pero de todas formas el error será captado por EDatabaseError.

La Cara Oculta de Delphi 4 dedica un capítulo al tratamiento de las excepciones. Lo podes descargar del FTP de Club Delphi.

Un saludo.


La franja horaria es GMT +2. Ahora son las 10:57:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi