2011-08-03 5 views
2

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.

+1

Je me demande qui vous a rabaissé; donc +1, car je pense que la question est très valable. –

+0

@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. –

+0

@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. –

Répondre

2

De votre description de votre problème, je suppose que vous spécifiez la ConnectionString de l'ADOQuery. Cela permet de combiner la connexion à la base de données avec l'exécution de la requête. Vous avez constaté que cela a des effets secondaires indésirables lorsque les informations d'identification de l'utilisateur ne sont pas valides. Séparez la connexion à la base de données de la requête à l'aide d'une connexion ADOConnection. Spécifiez la ConnectionString de ADOConnection et affectez ADOConnection à la propriété ADOQuery.Connection. De cette façon, vous contrôlez la connexion à la base de données et pouvez intercepter les connexions avec des informations d'identification incorrectes. De plus, la méthode ADOConnection.Open vous permet de spécifier le nom d'utilisateur et le mot de passe afin que vous n'ayez pas à les placer dans ConnectionString.

Bien que cela ne vous permette pas de répondre à des questions spécifiques, cette approche vous aidera à résoudre le problème de désactivation du profil de l'utilisateur en séparant le login de l'exécution de la requête.

+0

Vous avez raison. Après avoir soumis ma question (et avant que vous ayez répondu), je suis retourné et j'ai revérifié le code et l'ai remarqué moi-même. Le code, pour une raison quelconque, n'utilise pas un ADOConnection pour établir la connexion. Je n'ai pas eu le temps de vérifier cela hier soir, mais je vais m'en occuper aujourd'hui. – Jeedee

+0

Merci pour l'aiguillon dans la bonne direction.J'aurais dû le remarquer moi-même, mais pas pour une raison quelconque! La chaîne de connexion a été spécifiée sur ADOQuery, au lieu de sur une ADOConnection distincte. Je gère maintenant la connexion avant de soumettre la requête, et il n'y a aucun problème avec le profil en cours de désactivation. – Jeedee

Questions connexes