Ver Mensaje Individual
  #1  
Antiguo 11-05-2012
comodoro comodoro is offline
Registrado
 
Registrado: feb 2009
Posts: 3
Reputación: 0
comodoro Va por buen camino
Manejo de Excepciones de Base de Datos MySQL en Lazarus

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.
Archivos Adjuntos
Tipo de Archivo: zip ManejoExepciones By Tom Zambrano.zip (67,8 KB, 26 visitas)

Última edición por Casimiro Notevi fecha: 11-05-2012 a las 18:58:09.
Responder Con Cita