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 :

Bloc try Except


Sujet :

Bases de données Delphi

  1. #1
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut Bloc try Except
    Bonjour,

    j'ai un petit problème avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try
          adost2.Close;
          adost2.ProcedureName:=adost.ProcedureName;
          showmessage('try'+adost2.ProcedureName);
          adost2.Open;
        except
          on E:Exception do
          begin
             showmessage('except'+adost.ProcedureName);
            adost.ExecProc;
          end;
        end;
    en fait il s'agit de composants TADOStoredProc (adost et adost2) qui exécute dans une boucle des requêtes existantes dans une base Access.

    Certaines requêtes retourne un résultat et d'autre pas : ceci pour expliquer le adost2.open dans le try et le adost.execproc dans le except !!

    je veux biensur que les requêtes ne soient exécutées qu'une seule fois mais il passe aussi bien dans le try que dans le except donc lorsque j'arrive sur une requête d'ajout dans une table qui a déja été exécutée dans le adost2.open, il râle avec adost.execproc qui essaie d'exécuter la même requête d'ajout. donc problème de doublons dans la table !!

    quelqu'un aurait-il une solution à ce problème ?
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    l'except ne s'execute qu'en cas d'exception dans le try/except...ton open génère-t-il une exception ?

  3. #3
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    en fait, je pensais qu'il en générait une mais l'exception que j'avais était due au fait qu'il passe dans le try mais aussi dans le except donc doublons !

    le problème est que je ne sais pas dire à l'avance si je dois utiliser un "open" ou un "execproc" !!

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 795
    Points : 5 581
    Points
    5 581
    Par défaut
    Ne serait-il pas possible (au lieu de tenter un Open et de faire un Exec si cela ne marche pas) d'extraire le texte de la requete et de tester s'il commence par "Select" pour ensuite faire un Open ou un Exec dans une simple structure conditionnelle ?

  5. #5
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    l'idée est intéressante mais il y un ou plusieurs "select" dans toutes les requêtes

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par zemeilleurofgreg Voir le message
    l'idée est intéressante mais il y un ou plusieurs "select" dans toutes les requêtes
    Si la requête possède dans son texte Insert,Update ou delete alors tu fais un ExecSQL sinon tu fais un open

    Mais bon, avec les procédures stockées, c'est plus difficile.
    Il faudrait peut être que tu renommes tes procédures stockées afin de savoir si c'est une requête avec resultat ou non.

    Genre :
    insert_Nom_de_la_procedure_stockée
    delete_Nom_de_la_procedure_stockée
    select_Nom_de_la_procedure_stockée
    etc...

  7. #7
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Genre :
    insert_Nom_de_la_procedure_stockée
    delete_Nom_de_la_procedure_stockée
    select_Nom_de_la_procedure_stockée
    etc...
    pas possible car ce n'est pas ma DB

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    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 710
    Points : 25 596
    Points
    25 596
    Par défaut
    Je suppose que tu souhaite faire une fonction générique façon GetQuery, qui ouvre tout ce que tu lui donne à manger ... pourquoi ne pas ajouter un paramètre, ainsi tu déporte la question à l'appel de la fonction qui normalement, à ce moment, le type est connue ...

    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
    type
      TTypeStoredProcedure = (spResultSet, spCommand);
     
    function TSQLAssistant.ExecuteStoredProcedure(const AProcedureName: string; StoredProcedureType: TTypeStoredProcedure): TDataSet;
    begin
      if StoredProcedureType = spResultSet then
      begin 
        AdoProcWithResult.ProcedureName := AProcedureName;  
        AdoProcWithResult.Open();
        Result := AdoProcWithResult;
      end
      else
      begin
        AdoProcCommand.ProcedureName := AProcedureName;  
        AdoProcCommand.ExecProc();
        Result := AdoProcCommand;
      end;
    end;
    Sinon, tu utilise un TADOCommand, qui avec Execute permet de récupérer le ResultSet ou pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Command.CommandType := cmdStoredProc;
    Command.CommandTextAlias := 'ProcedureName'; 
    Command.ProcedureName := AProcedureName;  
    InitializeMasterFields(Self);
    _Recordset := Command.Execute;
    if IsResultSet(_Recordset) then // je te laisse trouver le IsResultSet, un Assigned pour commencer, ...
    begin
      Table.Recordset := _Recordset
    end;

  9. #9
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Salut le troll,

    tout cela m'a l'air bien passionnant bien que la première solution me semble plus élégante !

    pourrais-tu me donner quelques détails sur cette fonction ?

    s'agit-il de la fonction execute de base de l'objet ADO ou une fonction "maison" ?

    comment se passe l'appel de cette fonction ?

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    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 710
    Points : 25 596
    Points
    25 596
    Par défaut
    le TADOCommand, ben c'est l'objet sous-jacent du TADOStoredProc, le code que j'ai fourni n'est juste qu'un aggrégat du code ADO fourni avec Delphi 7 ... ensuite, ce n'est que de la théorie, ... je n'ai absolument rien testé, essaye, le code tel que !? pour les détails, consulte l'aide !

    sinon, je te conseille, pour ne pas perdre de temps, la 1ère solution, au moins dans le code c'est clair ...

  11. #11
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    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
    type
      TTypeStoredProcedure = (spResultSet, spCommand);
     
    function TSQLAssistant.ExecuteStoredProcedure(const AProcedureName: string; StoredProcedureType: TTypeStoredProcedure): TDataSet;
    begin
      if StoredProcedureType = spResultSet then
      begin 
        AdoProcWithResult.ProcedureName := AProcedureName;  
        AdoProcWithResult.Open();
        Result := AdoProcWithResult;
      end
      else
      begin
        AdoProcCommand.ProcedureName := AProcedureName;  
        AdoProcCommand.ExecProc();
        Result := AdoProcCommand;
      end;
    end;
    Elle est intéressante cette fonction mais mon problème reste entier car je ne sais pas quel type lui envoyer en paramètre ! (StoredProcedureType: TTypeStoredProcedure)

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    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 710
    Points : 25 596
    Points
    25 596
    Par défaut
    Même à l'appel, tu n'as pas l'information ? tu fais quoi ? tu lit une liste (TStringList) et tu executes à l'aveugle toutes les procédures ayant ce nom ? si oui, fait deux listes, l'une pour les Open et l'autre pour les Execute

  13. #13
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    oui je charge les requêtes dans une TStringList que j'exécute en boucle mais j'aimerais ne pas avoir à les identifier par un nom ou ce genre de truc afin que mon appli reste d'actualité en cas d'ajout de requêtes ou de modif !
    Donc l'idéal serait de savoir avant l'appel si je dois recevoir un résultat ou pas !

  14. #14
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par zemeilleurofgreg Voir le message
    oui je charge les requêtes dans une TStringList que j'exécute en boucle mais j'aimerais ne pas avoir à les identifier par un nom ou ce genre de truc afin que mon appli reste d'actualité en cas d'ajout de requêtes ou de modif !
    Donc l'idéal serait de savoir avant l'appel si je dois recevoir un résultat ou pas !
    Si tu n'as pas de liste ou quelques choses qui permettent de les identifiés comme requêtes avec ou sans résultat, comment veux tu que ton programme le sache ?

  15. #15
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Si tu n'as pas de liste ou quelques choses qui permettent de les identifiés comme requêtes avec ou sans résultat, comment veux tu que ton programme le sache ?
    je suis d'accord avec toi et c'est bien ça mon problème !!

    j'espérais que quelqu'un aurait une idée lumineuse

    Si la requête possède dans son texte Insert,Update ou delete alors tu fais un ExecSQL sinon tu fais un open
    c'est peut-être une possibilité, mais comment faire pour récupérer le code SQL de la requête ?

  16. #16
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par zemeilleurofgreg Voir le message
    c'est peut-être une possibilité, mais comment faire pour récupérer le code SQL de la requête ?
    Sur les procédures stockées je pense que c'est impossible (Vis à vis de la sécurité ça ne serait pas normale de pouvoir voir ce qu'il y a comme code dans la procédure)

  17. #17
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    merci Rayek, j'ai contourné le problème avec un TAG (requete avec résultat) lors de l'ajout des noms de requêtes dans l'application.

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

Discussions similaires

  1. Gestion exception (retourner dans le bloc try)
    Par hotman1313 dans le forum Langage
    Réponses: 6
    Dernier message: 14/10/2014, 11h03
  2. bloc try/except et API windows
    Par jakouz dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 24/02/2005, 13h21
  3. [try-catch] relancer les instruction du bloc try
    Par nounou dans le forum Langage
    Réponses: 11
    Dernier message: 12/05/2004, 12h23
  4. Réponses: 8
    Dernier message: 28/04/2004, 17h53
  5. Réponses: 5
    Dernier message: 21/04/2004, 12h43

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