¿Estás seguro de que no valida?
Lo que yo creo es que el evento OnPostError sí se genera pero no hace nada porque todo el código está rodeado por un condicional que no se cumple:
Código:
if (E is EDBEngineError) then
begin
{ código que no se ejecuta }
end;
El problema es que una excepción EDBEngineError sólo se ejecuta cuando accedes a la base através del BDE pero en tu caso lo haces por medio de ADO. Por tanto la excepción E nunca va a ser del tipo EDBEngineError.
Yo no conozco ADO pero haciendo algunas pruebas observo lo siguiente:
La componente TAdoConnection tiene una propiedad Errors que aparentemente almacena los errores que se generan. Desconozco en qué casos se almacena más de un error pero puedes intentar con el primero: TAdoConnection1.Errors[0].
Cada elemento de este arreglo tiene dos propiedades que pueden servirte:
NativeError y Description
NativeError te puede servir para determinar en el evento OnPostError a qué se debió el error mientras que Description contiene el texto del mensaje de error.
El siguiente código es la prueba que hice:
Código:
const
E_DB_KEYVIOLATION = -1605;
E_DB_REQUIREDFIELD = -3701;
procedure TForm1.ADOTable1PostError(
DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
case AdoConnection1.Errors.Item[0].NativeError of
E_DB_KEYVIOLATION:
raise Exception.Create('La llave se repite amigo');
E_DB_REQUIREDFIELD:
raise Exception.Create('Sin valor no hago nada');
end;
end;
Como dije, no sé gran cosa de ADO pero me parece que esto te puede servir como punto de partida.
// Saludos