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

Langage Delphi Discussion :

TOracleQuery . Open ?


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut TOracleQuery . Open ?
    Bonjour à tous,

    Je cherche l'équivalent de l'instruction :

    TQuery.Open avec un TOracleQuery ...

    Je n'ai pas la proposition .Open avec ce composant là...

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut

    C'est écrit dans FAQ : Comment se connecter à Oracle en utilisant les DOA ?
    Méthode Execute !

    Voir dans ...\Doc\Manual.pdf
    "Direct Oracle Access 4.1 User’s Guide" : TOracleQuery - Page 48
    Certe un PDF ce n'est pas très convivial mais faudrait le lire !, il est justement fourni pour remplacer le HLP

    Voir dans ...\Help\doa.hlp
    Cela contient la même chose que le PDF en une version "hypertext"


    J'avais déjà répondu à cette question dans ton sujet Delphi & DOA

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Je l'ai lu la FAQ pourtant mais je pensais pas que c'était le .Execute qui remplaçait le .Open...

    Donc en fait

    En TQuery :

    Ouvrir une requête : .Open
    Executer une requête : ExecSQL

    En TOracleQuery :

    Ouvrir une requête : .Execute
    Executer une requête : .Execute aussi ?

    Et pour un TOracleDataSet (?) :

    Ouvrir le dataset : .Open
    Executer le SQL du dataSet : .ExecSQL

    Correct ou non ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    TOracleQuery n'hérite pas du TDataSet
    C'est un composant conçu pour les routines de calcul, en n'implémentant pas le TDataSet, cela permet de gagner en performance (x2 ou même x3)

    Pense que DOA, ce n'est pas très répandu, moi même je connais pas, je l'ai regardé par curiosité lors d'une migration BDE+Paradox vers Oracle+ADO, il y a de cela 2-3 ans, j'ai trouvé cette library trop "dissidente" !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Je n'ai pas dit que ça héritait du TDataSet.
    Pour mes requêtes j'utilise soit une TOracleQuery soit je passe via un TOracleDataSet et là j'aimerai me créer une procédure LanceQuery qui selon le mot clé 'Execute', 'Open'... me fait l'action et me renvoi un booléen Vrai ou Faux... d'où mes questions.

    Executer et Ouvrir une requête en TOracleQuery c'est donc via la même méthode .Execute ?

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    j'aimerai me créer une procédure LanceQuery qui selon le mot clé 'Execute', 'Open'...
    Je ferais deux fonctions !
    L'une qui renvoie un boolean en cas de Succès du INSERT, UPDATE ... et peut-être même le nombre d'enregistrement altéré !
    Une seconde qui renvoi un TDataSet ouvert près à l'emploi (qu'il faudra explicitement libérer)

    Utiliser un mot clé, un paramètre string ???
    bof, une énumération ou un boolean serait plus adéquate !

    Vouloir faire une fonction pour les deux ne me semble pas être une bonne idée, mais c'est juste mon avis, j'ai l'équivalent dans mon code, je me suis aussi fait deux fonctions un OpenQuery et un ExecQuery

    Citation Envoyé par juju1988 Voir le message
    d'où mes questions.
    Toutes les réponses à tes questions sont dans le HLP\PDF de 300 pages, on est pas là pour le lire à ta place !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Pour mes questions si je les demande c'est bien que je n'ai pas trouvé la réponse ou du moins que je n'en suis pas sûre... sinon je sais lire.

    Pour la fonction j'en suis encore qu'à son ébauche j'ai fait ça pour le moment :

    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
    26
    27
    28
    function TestRequete(requete : TOracleQuery ; dataset : TOracleDataSet;  lancer, mess : string) : boolean;
    var
       x_i : integer;
       x_ok : boolean;
    begin
      x_ok:=False;
      x_i:=0;
      while not x_ok do
      begin
        inc(x_i);
        try
          x_ok:=True;
          if uppercase(trim(lancer))='OPENREQ' then requete.Execute;   // équivalent .Open ???
          if uppercase(trim(lancer))='EXECUTE' then requete.Execute;
          if uppercase(trim(lancer))='EXECSQL' then dataSet.ExecSQL;
          if uppercase(trim(lancer))='OPENDATASET' then dataSet.Open;
          except on e:exception do
          begin
            x_ok:=False;
          end;
        end;
      end;
      if x_i>3 then
      begin
        result:=False;
      end
      else result:=True;
    end;
    Je tente trois fois de faire mon action si cela ne fonctionne pas je renvoi faux... Pourquoi vaut-il mieux séparer en deux fonctions ? J'étais partie sur cette optique au début mais je me suis dit que cela faisait du code "pour rien" en gros...
    Enfin comme je t'ai dit ce n'est qu'une première idée

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Tu m'explique à quoi sert de passer un TOracleDataSet si tu veux faire un 'OPENREQ' sur TOracleQuery, tu lui passe nil, c'est moche, c'est quelque par entre Anti-Pattern "Ancre de bateau" et la "Programmation spaghetti"
    Au lieu de faire deux fonctions (20 lignes de plus), c'est tous les appels à TestRequete qui vont contenir des paramètres inutiles, mesure bien l'idée !

    Tu protèges comme les exceptions comme celle de la déconnexion ... un classique, autant d'abord forcer la connexion explicitement !
    il arrive qu'une application au bout d'un temps se fasse déconnectée par le SGBD, c'est configurable sur le serveur.

    Cela ne serait pas plus propre de résoudre le problème en amont au lieu d'une aussi d'utiliser une rustine
    Mais ne t'inquiète pas, j'ai vu la même chose dans le code que je maintiens pour Sybase+DBExpres !
    perso en 5 de MySQL+MyDAC, je n'ai jamais eu besoin de faire cela !
    Cela doit dépendre des libs et SGBD

    Pense à "loguer" les erreurs (e.Message et e.ClassName) dans un fichier, utile pour la maintenance !

    Sinon, euh, dans le genre code inutile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if x_i>3 then
      begin
        result:=False;
      end
      else result:=True;
    Commence donc par les réductions de base !
    Pourquoi ne pas utiliser aussi Result directement au lieu x_ok ?

    D'ailleurs pour le moment, tu boucles à l'infini tant que l'erreur persiste, tu n'as pas limité à trois échec !

    Avec une Enumeration, au lieu d'une chaine, tu pourrais utiliser un case of qui sera plus performant que tous ces if !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Oui excuse moi pour la boucle infinie j'ai oublié de te copier une partie du 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    function TestRequete(requete : TOracleQuery ; dataset : TOracleDataSet;  lancer, mess : string) : boolean;
    var
       x_i : integer;
       x_ok : boolean;
       //erreurMsg: string;
    begin
      x_ok:=False;
      x_i:=0;
      while not x_ok do
      begin
        inc(x_i);
        try
          x_ok:=True;
          if uppercase(trim(lancer))='OPENREQ' then requete.Execute;   // équivalent .Open ???  TOracleQuery
          if uppercase(trim(lancer))='EXECUTE' then requete.Execute;   // TOracleQuery
          if uppercase(trim(lancer))='EXECSQL' then dataSet.ExecSQL;   // TOracleDataSet
          if uppercase(trim(lancer))='OPENDATASET' then dataSet.Open;  // TOracleDataSet
          except on e:exception do
          begin
            x_ok:=False;
            //erreurMsg:=e.message;
          end;
        end;
        if x_i>3 then
        begin
          break;
        end
        else
        begin
          if not x_ok then
          begin
            OracleSession.LogOff; OracleSession.LogOn; ///// A vérifier ou :
            //OracleSession.Connected := False; OracleSession.Connected := True;
          end;
        end;
      end;
     
      if x_i>3 then
        result:=False
      else
        result:=True;
    end;
    Pour le e.Message pour logguer les erreurs c'est prévu je l'avais mis mais j'ai remis mon code au clair et oublié de le remettre...

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Un Break dans un while ! Non !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      while not x_ok and (x_i < 3) do
      begin
    le plus adapté serait un repeat ... until

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    until x_ok or (x_i >= 3)

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Euh oui mea culpa plutôt un exit ... désolée fin de journée !

    Oui un repeat until... serait peut être plus adéquat et cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          if uppercase(trim(lancer))='OPENREQ' then requete.Execute;   // équivalent .Open ???  TOracleQuery
          if uppercase(trim(lancer))='EXECUTE' then requete.Execute;   // TOracleQuery
          if uppercase(trim(lancer))='EXECSQL' then dataSet.ExecSQL;   // TOracleDataSet
          if uppercase(trim(lancer))='OPENDATASET' then dataSet.Open;  // TOracleDataSet
    est-elle correcte ? (A part le fait qu'il vaudrait mieux utiliser un case of ? (je le fais demain promis))

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Après une bonne nuit de sommeil et un retour sur mon code effectivement il valait mieux faire deux fonctions :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    function TestRequete(requete : TOracleQuery ; lancer : string) : boolean;
    var
       x_i : integer;
       x_ok : boolean;
       erreurMsg : string;
    begin
      x_ok:=False;
      x_i:=0;
      while not x_ok do
      begin
        inc(x_i);
        try
          x_ok:=True;
          case AnsiIndexStr(lancer, ['OPENREQ', 'EXECUTE']) of
     
            0 : begin
                  requete.Execute;
                end;
            1 : begin
                  requete.Execute;
                end;
            -1 : begin
                   x_ok:=False;
                   WriteLog('Anomalie dans TryQuery  = '+lancer);
                 end;
          end;
          except on e:exception do
          begin
            x_ok:=False;
            erreurMsg:=e.message;
          end;
        end;
        if x_i>3 then
        begin
          Exit;
        end
        else
        begin
          if not x_ok then
          begin
            OracleSession.LogOff; OracleSession.LogOn;
          end;
        end;
      end;
     
      if x_i>3 then
      begin
        result:=False;
        WriteLog('Anomalie dans le TryQuery avec le message d''erreur : ' + erreurMsg);
      end
      else
        result:=True;
    end;
     
     
     
    function TestDataSet(dataSet : TOracleDataSet ; lancer : string) : boolean;
    var
       x_i : integer;
       x_ok : boolean;
       erreurMsg : string;
    begin
      x_ok:=False;
      x_i:=0;
      while not x_ok do
      begin
        inc(x_i);
        try
          x_ok:=True;
     
          case AnsiIndexStr(lancer, ['EXECSQL', 'OPENDATASET']) of
     
            0 : begin
                  dataSet.ExecSQL;
                end;
            1 : begin
                  dataSet.Open;
                end;
            -1 : begin
                   x_ok:=False;
                   WriteLog('Anomalie dans TryQuery  = '+lancer);
                 end;
          end;
        except on e:exception do
          begin
            x_ok:=False;
            erreurMsg:=e.message;
          end;
     
        end;
        if x_i>3 then
        begin
          Exit;
        end
        else
        begin
          if not x_ok then
          begin
            OracleSession.LogOff; OracleSession.LogOn;
          end;
        end;
       end;
     
      if x_i>3 then
      begin
        result:=False;
        WriteLog('Anomalie dans le TryQuery avec le message d''erreur : ' + erreurMsg);
      end
      else
        result:=True;
    end;

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 27/05/2017, 10h14
  2. [Kylix] [Kylix 3] Installation version Open
    Par muadib dans le forum EDI
    Réponses: 1
    Dernier message: 14/03/2003, 16h37
  3. Réponses: 5
    Dernier message: 24/11/2002, 11h36
  4. [Kylix] Télécharger Kylix 3 Open Edition
    Par RDM dans le forum EDI
    Réponses: 2
    Dernier message: 27/08/2002, 11h28
  5. Choix d'un EDI pour la 3D (Open GL, Portable)
    Par Riko dans le forum OpenGL
    Réponses: 6
    Dernier message: 01/08/2002, 12h25

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