2009-03-27 7 views
4

J'ai une requête SQL pour ma SelectCommand sur mon SqlDataSource. Il se présente comme suit:Puis-je obtenir la requête exécutée à partir de SqlDataSource?

SELECT * FROM Books WHERE BookID = @BookID 

une zone de texte alimente le paramètre @BookID en utilisant un Asp: ControlParameter.

Quand je regarde SelectCommand quand pas à pas dans le code, je vois ceci:

SELECT * FROM Books WHERE BookID = @BookID 

Ce que je veux voir en fait est que si les types de personnes en 3 dans la zone de texte, je veux voir

SELECT * FROM Books WHERE BookID = 3 

Je n'arrive pas à comprendre comment accéder à ce qui précède?

+0

Si SqlDataSource vaut rien du tout, il sera passer la valeur de votre zone de texte comme paramètre @BookId pour aider à éviter les attaques par injection SQL. Comme le dit irperez ci-dessous, SQL Profiler est l'outil pour ce travail. – TGnat

Répondre

4

Une façon d'afficher la requête actuelle est d'utiliser SQL Profiler.

+1

Donc, aucun moyen de l'afficher réellement dans le code. – Xaisoft

+0

SQL Profiler affichera toujours la requête et le paramètre à côté de l'autre, vous ne verrez pas la requête complète verbeuse – cjk

+0

Je ne suis pas d'accord. J'ai utilisé Profiler pour voir quelles requêtes étaient passées pour voir ce qui se passait et il a craché une requête verbeuse. – irperez

0

Je suppose que vous ne serez pas en mesure de voir l'instruction select comme vous le souhaitez, car le paramètre n'est pas remplacé dans la déclaration par la valeur 3, mais envoyé comme vous l'avez écrit au serveur sql (avec le paramètre) .

C'est en fait bon car cela empêchera d'injecter du code sql malveillant dans votre zone de texte, par exemple.

Quoi qu'il en soit, vous ne pouvez pas récupérer la valeur passée au paramètre en utilisant ceci:

cmd.Parameters(0).Value

où cmd est votre SqlCommand?

2

La requête est jamais exécutée comme

SELECT * FROM Books WHERE BookID = 3 

Il est en fait la requête paramétrées avec le paramètre passé.

Vous pouvez faire un "Rechercher/Remplacer" sur la requête avec les paramètres liés pour voir à quoi cela ressemblerait.

2

(Cette réponse peut présumer avec la mise en œuvre SqlClient.)

Non, vous ne pouvez pas voir le code SQL exécuté. La classe SqlCommand appelle sp_execute (voir les deux méthodes SqlCommand.BuildExecute pour l'implémentation exacte) qui sépare la requête des paramètres. Vous aurez besoin d'utiliser Sql Profiler pour voir la requête exacte exécutée.

Vous pouvez utiliser la commande DbCommand fournie (à partir de l'événement de sélection) pour analyser votre CommandText et remplacer les paramètres par leurs valeurs réelles. Cela nécessiterait une certaine logique pour l'échappement, et ce ne sera pas la requête exacte que Sql Server exécute.

1
Public Function GenSQLCmd(ByVal InSqlCmd As String, ByVal p As Data.Common.DbParameterCollection) As String 
    For Each x As Data.Common.DbParameter In p 
     InSqlCmd = Replace(InSqlCmd, x.ParameterName, x.Value.ToString) 
    Next 
    Return InSqlCmd 
End Function 
0

Ceci est la version C# de la réponse d'Adam

public string GenSQLCmd(string InSqlCmd, System.Data.Common.DbParameterCollection p) { 
    foreach (System.Data.Common.DbParameter x in p) { 
     InSqlCmd = InSqlCmd.Replace(x.ParameterName, "'" + x.Value.ToString() + "'"); 
    } 
    return InSqlCmd; 
} 

Utilisation:

string DebugQuery = GenSQLCmd(cmd.CommandText, cmd.Parameters); //cmd is a SqlCommand instance 
Questions connexes