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
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
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
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 ?
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" !
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 ?
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
Toutes les réponses à tes questions sont dans le HLP\PDF de 300 pages, on est pas là pour le lire à ta place !
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 :
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...
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;
Enfin comme je t'ai dit ce n'est qu'une première idée
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
Commence donc par les réductions de base !
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;
Pourquoi ne pas utiliser aussi Result directement au lieu x_ok ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part result:= (x_i <= 3);
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 !
Oui excuse moi pour la boucle infinie j'ai oublié de te copier une partie du code :
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...
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;
Un Break dans un while ! Non !
le plus adapté serait un repeat ... until
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 while not x_ok and (x_i < 3) do begin
Code : Sélectionner tout - Visualiser dans une fenêtre à part until x_ok or (x_i >= 3)
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 :
est-elle correcte ? (A part le fait qu'il vaudrait mieux utiliser un case of ? (je le fais demain promis))
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
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;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager