Ver Mensaje Individual
  #3  
Antiguo 18-10-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿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
Responder Con Cita