Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Manejo de Excepciones de Base de Datos MySQL en Lazarus (https://www.clubdelphi.com/foros/showthread.php?t=78723)

comodoro 11-05-2012 17:54:30

Manejo de Excepciones de Base de Datos MySQL en Lazarus
 
1 Archivos Adjunto(s)
Saludos cordiales;

Buscando e investigando aqui y allá aunado a la experiencia desarrolle un procedimiento para el manejo de las excepciones de base de datos, especificamente MySQL, con Lazarus.

Es bueno hacer notar que hago uso de las libreria ZEOS Lib

Aqui les escribo el codigo, ademas lo adjunto para que puedan descargarlo:

Código Delphi [-]
unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, db, FileUtil, Forms, Controls, Graphics, Dialogs, DBGrids,
  ZConnection, ZDataset, ZDbcIntfs;

type

  { TForm1 }

  TForm1 = class(TForm)
    Conn: TZConnection;
    DBGrid1: TDBGrid;
    dsZQ1: TDatasource;
    ZQ1: TZQuery;
    ZQ1apellido_persona: TStringField;
    ZQ1cedula_persona: TLargeintField;
    ZQ1email_persona: TStringField;
    ZQ1fec_reg_persona: TDateField;
    ZQ1fnac_persona: TDateField;
    ZQ1genero_persona: TStringField;
    ZQ1nombre_persona: TStringField;
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    procedure TratarExcepciones (sender: tObject; E : Exception); //Se define el manejo de excepciones para la aplicacion
    procedure ManejarExcepcion (DataSet: TDataSet; E: EDatabaseError; //Se define el manejo de excepciones para la base de datos
      var DataAction: TDataAction);
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{$R *.lfm}

{ TForm1 }

//Implementacion del manejador de exepciones para la base de datos
procedure TForm1.ManejarExcepcion  (DataSet: TDataSet; E: EDatabaseError;
      var DataAction: TDataAction);
Var
  codigo_error  : Integer;
  str_Mensaje   : String;
  str_codigo_er : String;
begin
  codigo_error  := EZSQLException(E).ErrorCode;
  str_Mensaje   := EZSQLException(E).Message;
  str_codigo_er := IntToStr(codigo_error);
  case codigo_error of
       1048 : str_Mensaje := 'Columna no puede ser nula';
       1061 : str_Mensaje := 'nombre de clave duplicado';
       1062 : str_Mensaje := 'Entrada duplicada para clave';
       //...la lista continua ver MySQL 5.1 Reference Manual :: C.3 Server Error Codes and Messages
  end;
  MessageDlg ('Se ha producido un error.'+#13#10+'Error Nro.:'+str_codigo_er+#13#10+str_Mensaje , mtError,
[mbOk],0);
DataAction:=daFail;
end;

//Implementacion del manejador de exepciones para la aplicacion.
//Aca se pueden definir todas y establecer el codigo necesario
//para el manejo de cada una de ellas.
procedure TForm1.TratarExcepciones (sender: tObject; E:Exception);
Var
  codigo_error  : Integer;
  str_codigo_er : String;
  str_Mensaje   : String;
begin
    codigo_error  := 0;
    str_codigo_er := '';

    if (E is EZSQLException)
    then begin
         codigo_error  := (E AS EZSQLException).ErrorCode; //Codigo de error de la excepcion EZSQLException
         str_codigo_er := IntToStr(codigo_error);
         str_Mensaje   := (E AS EZSQLException).Message;
         case codigo_error of
              1045 : str_Mensaje := 'Acceso denegado para usuario. revise nombre y clave';
              1046 : str_Mensaje := 'Base de datos no seleccioanda';
              1146 : str_Mensaje := 'Tabla No existe';
              //...la lista continua ver MySQL 5.1 Reference Manual :: C.3 Server Error Codes and Messages
         end;
         MessageDlg ('Se ha producido un error.'+#13#10+'Error Nro.:'+str_codigo_er+#13#10+str_Mensaje , mtError,
[mbOk],0);
       exit;
    end;

    if (E is EConvertError)
    then begin
         str_Mensaje := (E AS EConvertError).Message;
         MessageDlg ('Se ha producido un error.'+#13#10+'Error Nro.:'+str_codigo_er+#13#10+str_Mensaje , mtError,
[mbOk],0);
       exit;
    end;
(*
    if (E is EDatabaseError)
    then begin
         codigo_error  := EZSQLException(E).ErrorCode; //Codigo de error de la excepcion EZSQLException
         str_codigo_er := IntToStr(codigo_error);
         str_Mensaje := (E AS EDatabaseError).Message;
         MessageDlg ('Se ha producido un error.'+#13#10+'Error Nro.:'+str_codigo_er+#13#10+str_Mensaje , mtError,
[mbOk],0);
       exit;
    end;
*)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Se asocia el manejador de exepciones de base de datos
  //al evento OnPostError del Zquery
  ZQ1.OnPostError:= @ManejarExcepcion;

  //Se asocia el manejador de exepciones de la aplicacion
  //al evento OnException de la Aplicacion
  Application.OnException := @TratarExcepciones;
 // try
    ZQ1.Open;
  //Except
  (*    on E: EZSQLException do
      begin
                 ShowMessage('Mi Mensaje de exepcion');
      end;
      *)
  //end;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  ZQ1.Close;
end;

end.

Casimiro Notevi 11-05-2012 18:57:15

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)


Recuerda poner los tags al código fuente, ejemplo:



Gracias :)



.

ecfisa 11-05-2012 19:01:53

Hola comodoro.

Gracias por compartir tu código con nosotros.

Saludos. :)

Casimiro Notevi 11-05-2012 19:13:42

Se me pasó :o

¡¡¡Gracias por la aportación!!! :)

ecfisa 11-05-2012 19:38:39

No mi amigo no se te pasó, ya habías echo mención:

Cita:

Empezado por Casimiro Notevi (Mensaje 432434)
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)
...
Gracias :)


Saludos.:)

Casimiro Notevi 11-05-2012 20:10:55

Cita:

Empezado por ecfisa (Mensaje 432440)
No mi amigo no se te pasó, ya habías echo mención: Saludos.:)

Cierto, ya la costumbre :)

comodoro 14-05-2012 14:18:04

Gracias por las observaciones!!!

Es un pequeño aporte para muchos programadores que se inician y que ya tienen un cierto nivel!!!


La franja horaria es GMT +2. Ahora son las 15:46:42.

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