Como Capturar Mensajes de Errores de la BD

Quisiera saber si que de que forma puedo capturar los mensajes de errores de una base de datos por ejemplo duplicar clave primaria o que el registro a borrar no se pueda por que esta siendo utilizada en otra tabla u otros errores. Utilizando BDE como componente de conexión.

1 Respuesta

Respuesta
1
Bueno mira cuando usas Query ya se TQuery o rxQuery por lo general estos eventos no se ejecutan, aunque te diré que no he usado los rxQuery se que son los componentes RxLib, bueno te pondré un ejemplo del OnPostError para rxQuery:
procedure TForm1.RxQuery1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if pos('Violation key',E.Message)<>0 then
begin
ShowMessage('El registro ya existe');
Abort;
end;
end;
Explicación:
Si te das cuenta en el evento ya tiene por default una variable "E" de tipo EDataBaseError, bueno pues en esta variable se cargan los posibles errores en E.Message, entonces a través de la función PUES yo busco la palabra 'Violación Key' (no precisamente puede venir quizá pueda decir Primary Key Violation, peo eso lo puedes ver verificando que tiene el E.Message, bueno entonces la función pues si encuentra el string me devuelve un valor diferente a cero y si lo encuentra en este ejemplo me enviara un mensaje de que el registro ya existe y la palabra Abort, significa que abortara la operación y de esta manera ya cachaste el error.
Ahora bien, como te mencione quizá el evento no se ejecute por ser un Query, pero checalo primero, y si no te funciona haremos otra cosa. Ok
saludos
Pero estoy usando rxQuery de todas maneras también tienen los eventos onUpdateError, onDeleteError, lo que quisiera saber es como capturar el error, pues estoy empezando recién a programar y me seria muy útil saber el código para hacerlo
Me supongo que estas usando un TTable...
Verifica los eventos de este componente, te darás cuenta que hay un BeforePost, BeforeEdit... etc y también hay unos eventos llamados OnPostError, OnEditError... entonces cuando por ejemplo hay un error de inserción ya sea porque violaste una llave primaria el evento del OnPostError se dispara y ahí puedes cacharlo... ok
Ok vamos hacerlo diferente... mira tratemos primero de hacerlo de una manera correcta.. ok
Ahora vas a usar otros componentes en conjunto con los querys ok.. estos componentes se llaman ClientDataSet, este clientDataSet funciona como una tabla.. como lo conectas:
Pones un ClientDataSet, pones un DataSetProvider y pones tu query
Ahora el DataSetProvider lo conectas al Query y el Provider lo conectas al Client cada uno tiene sus propiedad para apuntar a cada componente.. ok ahora ya teniendo esta conexión olvidate por completo del query y también del provider ahora todo manipulalo con el Client, como te mencione el Cient es como un TTable igual, y verifica los eventos de OnPostError y todo esos aquí si funcionan, ahora un tip...
Para Grabar:
ClientDataSet. Post; //Este te graba temporal es decir con esto aun no te ha grabado a la base de datos...
ClientDataSet. ApplyUpdate(0); //Este ya te graba a la base de datos... ok
Bueno intentalo así... a ver si te funciona...
Si no te funciona, entonces lo vas a tener que controlar manualmente... ¿cómo? Así:
En el evento BeforePost tendrás que hacer todo...
Por ejemplo:
Este evento se ejecuta antes de grabar ok... así que por ejemplo para cachar el error de llaves repetidas..
Si por ejemplo tu estar insertando la llave 20 y esta ya existe entonces primero (antes de grabar) deberás ejecutar un query en donde buscaras esa llave que estar insertando si el query te arroja vacío significa que todo esta bien y el proceso sigue normal...
Ahora si el query te arrojo que ya hay uno entonces pones lo siguiente:
if not QueryBuscarLlave.IsEmpty then
begin
ShowMessage('El registro ya existe');
Abort;
end;
Al poner el abort entonces te abortara la operación de inserción y ya no te saldrá el error de la base de datos... si me explique... ok
Suerte...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas