2010-09-02 2 views
4

J'ai une requête avec des paramètres dans un Devart TMSQuery.SQL. Quelque chose commeDelphi: Comment obtenir la requête qui est passée au serveur lorsque les paramètres sont utilisés

select * from customers 
where customer = :CustomerID 

dans le code que je ne

// Delphi 
sqlcustomer.ParamByName('CustomerID').asinteger := 4; 
sqlcustomer.open; 

Je veux voir le débogage et la commande SQL exacte envoyée au serveur, si j'essaie d'utiliser TMSQuery.sql je viens de le: CustomerID, alors que je voudrais avoir ceci:

select * from customers 
where customer = 4 

est-il un moyen rapide d'avoir cela sans lire tous les paramètres et la reconstruction manyally la requête?

Bien sûr, j'ai une question très importante avec plus de 100 paramètres, ce pourquoi je besoin de ce

+0

deux questions 1) Quelle base de données utilisez-vous? 2) utilisez-vous BDE? – RRUZ

+0

Non J'utilise SQL SERVER avec des composants DevArt, j'ai demandé TQUery car il est plus globalement compris – LaBracca

+0

Vous devez fournir une telle information dans votre question, c'est très important. J'ai modifié vos tags. – RRUZ

Répondre

4

La déclaration proprement dite SQL d'une requête paramétrées qui est envoyée au serveur ne contient jamais une représentation textuelle des valeurs des paramètres . Au lieu de cela, il utilise des caractères d'espace réservé, par ex. points d'interrogation. Dans votre exemple, ceci serait select * from customers where customer = ? Ceci est préparé sur le serveur et les valeurs des paramètres sont ensuite envoyées par le client dans un appel séparé.

+0

Je ne le savais pas, de toute façon j'ai commencé à le suspecter en regardant sql server profiler. Je pensais que les paramètres étaient juste une façon de faire du texte et de le remplacer, alors que selon ce que vous dites, il y a quelque chose de plus profond ... Quel est l'avantage de passer des paramètres dans un appel spearate? Quelle est la différence si je recherche et répale le texte avant d'exécuter la requête? – LaBracca

+1

Le serveur préparera la requête (allouer les ressources, créer un plan de requête) une seule fois lorsqu'il recevra le SQL avec les espaces réservés et réutilisera la requête avec les paramètres réels. Cela peut améliorer considérablement les performances pour les exécutions répétées de la requête. – mjn

+0

Le serveur préparera et réutilisera la même requête préparée si vous ordonnez au moteur de le faire, de manière générale avec un appel à la méthode .Prepare ou à la valeur true de la propriété Prepared. Cela améliorera considérablement l'efficacité, par exemple dans les boucles. D'autre part, en utilisant des paramètres, vos applications sont à l'abri des attaques par injection de code SQL. Enfin, dans certaines bases de données (oracle par exemple), le moteur réutilise le plan de session d'autrui si la même requête textuelle provient de clients différents. Ainsi, l'utilisation de requêtes paramétrées permet de réduire les temps d'exécution et la charge du serveur. – jachguate

3

Si vous utilisez des composants Devart, ils ont un composant TMSSQLMonitor qui peut vous aider. Si vous vous connectez via odbc, vous pouvez surveiller le sql en activant le traçage sur l'onglet odbc.

Si vous utilisez une autre combinaison, veuillez décrire.

+0

Bonjour, j'ai essayé TMSSQLMonitor, mais dans le journal je n'ai que des caractères chinois ... J'ai Delphi 2009, peut-être cela a un problème avec unicode ?, c'est par exemple ce que j'ai dans la fenêtre du journal: 14 14.21.25 – LaBracca

+0

Tipp utile toujours demandé ce qui est pour un composant – Hidden

Questions connexes