IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

[D2005][Firebird]EDatabaseError impossible à intercepter


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Par défaut [D2005][Firebird]EDatabaseError impossible à intercepter
    Bonne année à tous...

    Lors de la suppression, si je viole les contrainte d'intégrité de la DB, Delhpi génère un EDabaseError. Je veux le gérer (avec un message) mais rien ne se passe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    procedure TFrmTypeChambre.ActionSupprimerExecute(Sender: TObject);
    begin
      try
        DM.CDSTypeChambre.Delete;
        DM.CDSTypeChambre.ApplyUpdates(0);
      except
        on EA: EAbort do
        begin
          DM.CDSTypeChambre.Cancel;
          Exit;
        end;
        on EDB: EDatabaseError do
        begin
          ShowMessage(ERROR + EDB.Message + NO_DELETE + TYPE_CHAMBRE);
          DM.CDSTypeChambre.Cancel;
          Exit;
        end;
        on E: Exception do
        begin
          ShowMessage(ERROR + E.Message + NO_DELETE + TYPE_CHAMBRE);
          DM.CDSTypeChambre.Cancel;
          Exit;
        end;
      end;
    end;
    Le EAbort est OK (je le genère dans le BeforeDelete avec un message de confirmation de suppression), mais les autres, je n'y arrive jamais.

    Pourquoi? Pourtant quand je supprime j'ai

    Project raised exception class EDatabaseError with message 'Database server Error : violation of FOREIGN KEY constraint xx on table YY'.
    après le 'continue', j'ai

    Project raised exception class EDatabaseError with message 'Unable to find record. No key specified'
    Donc 2 EDatabaseError et mon code ne voit rien

    Une idée?

  2. #2
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 573
    Par défaut
    Salut

    Si j'ai bien compris, tu utilises des composants TClientDataSet et TDataSetProvider par lesquels les exceptions générées par la base de données ne sont pas "visibles", cela s'explique par le fait que les processus (voire les machines) dans lequel se trouvent les composants de bases de données (serveur d'application) et celui dans lequel se trouve les composant ClientDataSet (application cliente) ne sont pas forcément les mêmes.

    Il existe des événements spécifiques pour traiter les erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TCustomClientDataSet.OnReconcileError
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TBaseProvider.OnUpdateError
    Consultes la documentation et fait des tests car je n'ai pas beaucoup de temps. Reviens si tu as des problèmes

    Note : Si ton serveur d'application est distant, il est impératif que la gestion d'erreur soit nickel car tu pourras difficilement gérer un plantage de ton serveur à partir du client.

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Par défaut
    Merci Eric,

    En effet, gérer l'erreur là est possible. Mais j'ai encore un problème pour rafraichir mon ClientDataSet parce que après le OnReconcile Error, je ne suis plus sur le champ que j'ai essayé d'effacer et ma grille n'est plus dans le même ordre (le champs non effacé est à la fin du dataset).

    en gros, voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TDmChambre.CdsTypeChambreReconcileError(DataSet: TCustomClientDataSet;
      E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);
    begin
      case UpdateKind of
        ukDelete: begin
          Action := raCancel;
          ShowMessage(NO_DELETE_TYPE_CHAMBRE);
        end;
      else begin
          Action := raCancel;
          ShowMessage(ERROR + E.Message + NO_DELETE + TYPE_CHAMBRE);
        end;
      end;
    end;
    Si tu as une idée pour comment remettre tout comme c'était avant le delete, ce serait super.

  4. #4
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 573
    Par défaut
    Si ta requête est munie d'une clause ORDER (recommandé afin de contrôler l'ordre d'extraction), tu peux éventuellement fermer et ré-ouvrir ton clientDataSet afin de le rafraichir.

    Cela fait longtemps que je n'ai pas travaillé sur ce sujet.

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

Discussions similaires

  1. [BDE][FIREBIRD][Win8] impossible de se connecter à la base de données
    Par SergioMaster dans le forum Bases de données
    Réponses: 9
    Dernier message: 20/05/2015, 13h37
  2. Connexion base firebird simultanée impossible (ou presque)
    Par engi dans le forum Connexion aux bases de données
    Réponses: 9
    Dernier message: 15/06/2013, 16h49
  3. [D2005]/[C#] Erreur : "Impossible de créer le proces
    Par fab56 dans le forum Delphi .NET
    Réponses: 5
    Dernier message: 17/08/2005, 12h29
  4. [firebird] Connexion impossible en lecture seule
    Par severine dans le forum Administration
    Réponses: 2
    Dernier message: 01/08/2003, 15h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo