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 :

Intercepter les messages d'erreur du SGBD FireBird


Sujet :

Bases de données Delphi

  1. #1
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut Intercepter les messages d'erreur du SGBD FireBird
    Bonjours,
    J'ai deux tables liées par la relation 1-n (la clé étrangère est idservice):
    Services(idservice,nomservice)----1,n-----Employés(idemployé,idservice,nom,adresse,qualité).
    A la suppression d'un enregistrement de la table Services, un message d'erreur du SGBD (Firebird) apparait : Violation of FOREIGN KEY, si l'enregistrement en question est lié à la table Employés.

    Comment intercepter ce message d'exception et afficher un message personnalisé ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    try except EDatabaseError
    selon ta couche d'accès, tu pourras avoir une classe d'exception plus précise
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    try except EDatabaseError
    selon ta couche d'accès, tu pourras avoir une classe d'exception plus précise
    J'utilise TZQuery de Zeos, donc je suppose que je dois utiliser le Try Except dans l'événement OnDeleteError, mais je ne vois pas qu'est ce que je dois écrire entre Try et Except.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Je ne connais pas Zeos, mais OnDeleteError c'est du standard TDataSet !

    Soit tu écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
      ZQuery.Exec();
    except
      on e: EZDatabaseError do
        ...
      on e: EDatabaseError do
        ...
    end;
    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      // TZQueryHelper sera une classe que TU devras créer !
      ZQuery.OnDeleteError := TZQueryHelper.TaProcedureDeGestionDErreur;
      ZQuery.Delete();
    ...
     
    /*class*/ procedure TZQueryHelper.TaProcedureDeGestionDErreur(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
    begin
      ...
      Action := daAbort; ...
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Soit tu écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
      ZQuery.Exec();
    except
      on e: EZDatabaseError do
        ...
      on e: EDatabaseError do
        ...
    end;
    Donc j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Try
    ZQuery.ExecSQL;   //ZQuery.Exec(); n'existe pas.
    Except
    on E: EDatabaseError  do   //y a t'il possibilité de faire la différence entre différentes exception du SGBD  ?
    Showmessage('Erreur SGBD :'+E.Message);
    end;
    Mais ça ne marche toujours pas, je n'obtiens que l'exception du SGBD.
    par contre, en écrivant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Showmessage('Erreur SGBD :'+E.Message);
    dans l'événement OnDeleteError j'obtient mon message suivi par l'exception du SGBD. Et bien sur je ne veut pas que le message du SGBD apparait

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Citation Envoyé par adelneo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    except
      on E: EDatabaseError  do   //qu'elle est l'utilité se cette instruction ?
    Cela permet de filtrer sur un type donné d'exception, ainsi seules ces exceptions seront capturées, les autres continueront leur chemin ...

    lit bien ma réponse, tu as loupé

    Voir TDataSet.OnDeleteError et de TDataAction

    .
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    L'aide est aussi fourni en locale !
    Le Code de ZeosLib est accessible, profite pour le consulter !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TDM.carburantsDeleteError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    begin
      action := daabort;
      showmessage('Mon Message') ;
    end;
    Pour FireBird, utilise donc plutôt UIB, Zeos semble mourir petit à petit depuis le passage à l'unicode, et son manque de documentation est rebutant !

    Sinon, si tu as une version Pro, ce que je crois, utilise ADO, cela fonctionne avec les Drivers ODBC !
    Au moins, ça c'est standard Delphi, c'est toujours le problème de library tierce, peu pourront t'apporter une réponse tout simplement parce que l'utilisation reste mineure !

    Pour en revenir à Zeos
    tu semble utiliser un DELETE en SQL avec un TZQuery et ExecSQL ?
    Du moins, c'est que je crois, tu aurais pu fournir un exemple de ton de code de suppression, j'ai très flou ce que tu racontes, tu devrais voir avec ton Développeur ce qu'il faut gérer, après c'est son travail, ce n'est pas à l'ingénieur réseaux de faire cela !

    ExecSQL ne semble pas déclencher une Exception EZDatabaseError (qui hérite de EDatabaseError), il faudrait voir les propriétés que cette classe propose.
    Je trouve cela très étrange que ExecSQL ne provoque pas d'exception, très étrange cette ZeosLib ou alors tu l'utilises mal !
    Il semblerait que EZDatabaseError qualifie l'exception aussi avec un ErrorCode ainsi qu'un StatusCode !

    il faudrait allez sur le Forum Zeos qui n'est pas une lib standard Delphi, par manque d'expérience, on ne peut pas t'aider !

    Pense qu'il existe aussi un TZUpdateSQL qui permet d'utiliser la méthode Delete()
    Normalement le OnDeteleError est couplé avec un Delete() et non avec un ExecSQL()
    Je pense que le principal soucis est là !
    Soit c'est une mauvaise utilisation
    Soit Zeos est étrange et propose des comportements peu standard !
    Il faut avoué que les lib DB c'est un peu le souk, chacune fonctionne à sa sauce !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut
    En fin à la maison
    Citation Envoyé par ShaiLeTroll Voir le message
    L'aide est aussi fourni en locale !
    Le Code de ZeosLib est accessible, profite pour le consulter !

    Est-ce que tu comprends ce que tu écris ? Je n'ai pas l'impression

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TDM.carburantsDeleteError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    begin
      action := daabort;
      showmessage('Mon Message') ;
    end;
    J'ai bien compris ta question monsieur , et j'ai déjà tenté avec e bout de code mais sans succès.
    J'ai pas dit que l'exception ne se déclenche pas , mais que mon message n’apparaît pas.
    pour la suppression, j'utilise pour tester un DBNavigator.
    Pour le changement de mes composants trop tard mon application est à 99% terminée.

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Tu utilises un TDBNavigator, donc un Delete() !
    Pourquoi avoir repris la version "ExecSQL" de la gestion de l'erreur, tu m'as embrouillé !
    Dans mon message de 14h01, j'avais mis soit "ExecSQL" soit "Delete()" comme tu n'avais pas précisé, j'ai du répondre large !
    Comme tu es parti sur "ExecSQL", toute mes suppositions étaient fausses !
    Il faut être PRECIS lorsque l'on pose une question !

    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TDBNavigator.DataSource.DataSet.OnDeleteError = carburantsDeleteError;
    J'espère que Zeos gère correctement le Action daAbort !
    Tu devrais allez sur le forum, après tout, ils doivent mieux connaitre que nous !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut
    désolé ! Je savait pas que la liaison était importante.
    ça marche enfin, merci Shailetroll. et désolé si je vous ai mal compris.

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Citation Envoyé par adelneo Voir le message
    désolé ! Je savait pas que la liaison était importante.
    ça marche enfin, merci Shailetroll. et désolé si je vous ai mal compris.
    la liaision entre OnDeleteError ?
    C'est indispensable
    Chaque TZQuery, chaque TDataSet est indépendant, donc pour chacun tu dois affecter le gestionnaire d'évènement !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut
    Je vois qu'on dévie de notre sujet principal. Au fait la piste que tu viens de me montrer ne suffit pas, puisque je ne peux pas filtrer les différent cause de l'exception déclenchée ! donc mon code va traiter toutes les exceptions liées à l’évènement OnDeleteError de la même façon, ce qui n'est pas correcte.
    et en exécutant ce 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 TDM.ZQueryDeleteError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    begin
    try
    dataset.Delete
    except
    on e:EDatabaseError do
    begin
    action:=daabort;
    showmessage('exception');
    end;
    end;
    end;
    l'application plante.

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Oui, on déborde !

    D'ailleurs, tu n'aurais pas un débordement de pile comme erreur ?
    Tu entres dans une récursivité,
    tu fais Delete(), il plante provoque un OnDeleteError qui refait un Delete() qui replante ...

    Tu dois affecter pour chaque DataSet, son propre gestionnaire de OnDeleteError si tu veux un traitement spécifique à chacun !

    la variable E tu dois pouvoir utiliser is et as

    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
    procedure TDM.carburantsDeleteError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    begin
      action := daabort;
     
      if E is EZDatabaseError then
      begin 
        if EZDatabaseError(E).ErrorCode = ValeurATrouve then 
          ShowMessage('Contrainte');
        ...
     
      end;
     
      showmessage('Mon Message') ;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  14. #14
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut
    Le problème est résolu.
    Merci Shailetroll.
    voici le bout de code que j'ai utilisé
    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
     
    procedure TDM.carburantsDeleteError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    begin
     
    action:=daabort;
    if E is EDatabaseError then
     if EZDatabaseError(E).ErrorCode=-530 then // et ainsi de suite pour les autres code d'erreur
     application.MessageBox('Erreur SQL: Violation de Clé étrangère',
        'Erreur !',MB_ICONSTOP + MB_OK)
      else
      application.MessageBox('Erreur SQL: Suppression Impossible',
        'Erreur !',MB_ICONSTOP + MB_OK);
     
    end;
    la liste des code d'erreur est disponible sur le lien suivant (FB 2.1)
    www.firebirdsql.org

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Intercepter les messages d'erreurs de requetes
    Par sabdoul dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/04/2013, 12h08
  2. Réponses: 6
    Dernier message: 21/05/2008, 19h16
  3. [Message d'erreur] gérer les message d'erreurs
    Par heid dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2004, 14h57
  4. recuperer les messages d'erreurs de interbase
    Par devalender dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/06/2004, 11h45
  5. Réponses: 2
    Dernier message: 06/04/2004, 08h39

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