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 = 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
procedure TratarExcepciones (sender: tObject; E : Exception); procedure ManejarExcepcion (DataSet: TDataSet; E: EDatabaseError; var DataAction: TDataAction);
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
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';
end;
MessageDlg ('Se ha producido un error.'+#13#10+'Error Nro.:'+str_codigo_er+#13#10+str_Mensaje , mtError,
[mbOk],0);
DataAction:=daFail;
end;
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; 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';
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;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ZQ1.OnPostError:= @ManejarExcepcion;
Application.OnException := @TratarExcepciones;
ZQ1.Open;
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
ZQ1.Close;
end;
end.