Vue d'ensemble:
J'ai écrit une application qui permet à un utilisateur de définir une requête, le soumettre à un serveur et afficher les résultats. Le logiciel peut fonctionner sur DB2 ou MySQL.TADOQuery SQL.add() soumettre/préparation de la sql
Problème:
Nous avons eu des problèmes dans la version DB2 où un utilisateur a essayé d'exécuter une requête, et a constaté qu'il a échoué parce que leur profil d'utilisateur a été désactivé. Pour exécuter une requête sur DB2 (sur un IBM i), le nom de profil et le mot de passe de l'utilisateur sont fournis dans la chaîne de connexion. La sécurité sur le serveur peut spécifier que le profil d'un utilisateur est désactivé après deux ou trois connexions incorrectes.
Question:
J'ai débogués l'application et a constaté que le problème est en baisse à la requête soumise deux fois. Si le mot de passe de l'utilisateur est erroné, alors, bien sûr, cela a pour effet de désactiver son profil. En outre, lorsque j'ai inspecté les journaux sur le serveur (lors du débogage ligne par ligne), j'ai constaté que la requête est soumise au serveur lorsque vous appelez TADOQuery.sql.add(), et à nouveau lorsque la propriété active de TADOQuery est définie sur true (le point auquel je m'attends à ce que la requête soit soumise au serveur). Voici un exemple du code que j'utilise pour exécuter la requête:
adoqry.active := false;
adoqry.sql.clear;
adoqry.sql.add('SELECT * FROM SOMEDB.SOMETABLE');
adoqry.active := true;
Ma question est donc simple:
1. Pourquoi la méthode TADOQuery.sql.add() soumettre la requête (quand il devrait juste ajouter le sql à la propriété sql de TADOQuery)?
2. Que puis-je faire pour éviter cela? En d'autres termes, existe-t-il un moyen d'empêcher la soumission de sql lorsque j'appelle la méthode add()? Pour ceux d'entre vous qui souhaitent obtenir des informations supplémentaires sur les journaux, les journaux de point de sortie sur IBM i montrent que lorsque j'appelle adoqry.sql.add dans l'exemple ci-dessus, la requête est exécutée via le Requêtes SQL "application point de sortie, via la fonction" Préparer et décrire ". Lorsque j'appelle adoqry.active: = true dans l'exemple ci-dessus, la même requête passe par la même application de point de sortie, mais via la fonction "Ouvrir/Décrire".
Si vous n'êtes pas familier avec l'IBM i, ne vous inquiétez pas - j'inscris juste cette information comme preuve que j'ai suivi la requête soumise deux fois. Le vrai problème est avec le traitement sql.add() de TADOQuery.
Je me demande qui vous a rabaissé; donc +1, car je pense que la question est très valable. –
@Jeroen - Je suppose, mais je pense que la raison de la downvote est que cette question est, d'une façon ou d'une autre, * trompeuse *. En aucun cas, appeler '.SQL.Add' peut lancer une requête. Il insère le texte dans .SQL, ferme l'ensemble de données dans le notificateur de changement, met à jour le CommandText du .SQL, initialise les paramètres en même temps, efface l'indicateur de mise à jour sur FieldDefs, etc., etc. , efface les choses. Il y a un autre inconnu dans ce, ne sais pas, un événement mal géré etc. –
@Sertac - bien, mais pourquoi downvote? OMI c'est la question parfaitement formatée et valide. S'il y a une fausse maničre de savoir comment OP va faire quelque chose, dirigeons-le vers le bon. –