PDA

Ver la Versión Completa : Manejo de Excepciones de Base de Datos MySQL en Lazarus


comodoro
11-05-2012, 17:54:30
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:

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 (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)


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

http://neftali.clubdelphi.com/images/UtilizarTAGs.png

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:

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)
...
Gracias :)



Saludos.:)

Casimiro Notevi
11-05-2012, 20:10:55
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!!!