PDA

Ver la Versión Completa : No puedo detectar la excepción "EDatabaseError"


Adan
28-04-2004, 18:50:04
Saludos,

Tengo el siguiente problema, trabajo con Delphi 7 y una Base de Datos Interbase 7.0, estoy usando una tabla que contiene información, la llave primaria es mi número de expediente que es de tipo char de 10 caracteres y la tengo definida como la Primary key "PK_NEXPEDIENTE".

En mi programa de delphi uso los componentes del DBexpress y al momento de insertar un registro con un expediente que ya existe, deseo atrapar la excepción y mostrar un mensaje al usuario que diga "Expediente ya existente".
mi código es el siguiente:

try
clientdataset1.Post;
if (clientdataset1.ChangeCount > 0) then
clientdataset1.ApplyUpdates(-1);
except
on E: Exception do begin
ShowMessage('Expediente ya existente');
end

pero al correr el programa e introducir el dato duplicado, nunca me arroja la excepción. Si lo corro desde delphi, el compilador si me arroja el error de "EdatabaseError violation of primary key..." pero nunca me arroja el mensaje de excepción. Y al correrlo fuera de delphi, obviamente nunca me marca el error a pesar de que no lo puede insertar por estar duplicado el expediente.

también intenté lo siguiente:

try
clientdataset1.Post;
if (clientdataset1.ChangeCount > 0) then
clientdataset1.ApplyUpdates(-1);
except
on E: EDatabaseError do begin
ShowMessage('Expediente ya existente');
end

y tampoco la atrapa, se sigue de largo.

Alguna idea para solucionarlo????

Gracias de Antemano

Adán

sanxpue
28-04-2004, 19:54:31
Tal vez no puedas detectar el error ya que no es un Exception o un EDataBaseError, prueba con EIBInterbaseError

Adan
28-04-2004, 20:47:44
lo intenté así y nada, se sigue de largo, despues de ejecutar la línea
cds1.ApplyUpdates(-1);
y marcar el error de "EDatabaseError primary key violation..." no ejecuta mi código de excepción.

Alguna idea??

try
cds1.Post;
if (cds1.ChangeCount > 0) then
cds1.ApplyUpdates(-1);
except
on E: EIBInterbaseError do begin
ShowMessage('Error al guardar la manifestación');
end;



Tal vez no puedas detectar el error ya que no es un Exception o un EDataBaseError, prueba con EIBInterbaseError

cmagno
28-04-2004, 20:56:26
Lo que te falta es añadir la libreria IB en la sección de declaracion de librerias de la interfaz de tu unidad ....

interface

uses

IB, .... el resto de las unidades por defecto

Espero que te haya podido ayudar! :D

Adan
28-04-2004, 21:06:14
ya tengo esa libreria (IB) y tambien DB, y nada, nunca detecta la excepción, se sigue de largo...


Otra Idea :rolleyes: ??

Adán


Lo que te falta es añadir la libreria IB en la sección de declaracion de librerias de la interfaz de tu unidad ....

interface

uses

IB, .... el resto de las unidades por defecto

Espero que te haya podido ayudar! :D

igiron
30-04-2004, 01:04:51
Hola:

Algo que puedes hacer es utilizar el ApplyUpdates de esta manera

if DATASET.ApplyUpdates(0) > 0 then begin
messagebox('No se inserto el registro en la base de datos');
DATASET.cancel;
exit;
end if

Creo que esta es una forma, porque ApplyUpdates devuelve la cantidad de errores que produjeron al aplicar los cambios en la base de datos.

Espero que te ayude.

Saludos :p

igiron
30-04-2004, 01:20:41
Algo que no me percate fue:

El TRY tienes el EIBDatabaseException y el error lo esta produccion el EDatabaseException que se encuentra en DB.


;)

CCCP
20-03-2005, 11:29:05
prueba hacer un reconcile del cds

Delfino
21-03-2005, 20:07:24
Prueba haciendolo en el evento OnPostError del dataset, inluso puedes condicionarlo con el IBErrorCode..