Est-il possible d'get le text analysé d'un SqlCommand avec SqlParameters?

Ce que j'essaye de faire est de créer une command sql arbitraire avec des parameters, de définir les valeurs et les types de parameters, puis de renvoyer la command sqs parsed – avec les parameters inclus. Je ne vais pas exécuter cette command directement sur une database sql, donc aucune connection ne devrait être nécessaire. Donc, si j'ai exécuté le programme d'exemple ci-dessous, j'espère voir le text suivant (ou quelque chose de similaire):

WITH SomeTable (SomeColumn) AS ( SELECT N':)' UNION ALL SELECT N'>:o' UNION ALL SELECT N'^_^' ) SELECT SomeColumn FROM SomeTable 

Et l'exemple de programme est:

 using System; using System.Data; using System.Data.SqlClient; namespace DryEraseConsole { class Program { static void Main(ssortingng[] args) { const ssortingng COMMAND_TEXT = @" WITH SomeTable (SomeColumn) AS ( SELECT N':)' UNION ALL SELECT N'>:o' UNION ALL SELECT @Value ) SELECT SomeColumn FROM SomeTable "; SqlCommand cmd = new SqlCommand(COMMAND_TEXT); cmd.CommandText = COMMAND_TEXT; cmd.Parameters.Add(new SqlParameter { ParameterName = "@Value", Size = 128, SqlDbType = SqlDbType.NVarChar, Value = "^_^" }); Console.WriteLine(cmd.CommandText); Console.ReadKey(); } } } 

Est-ce quelque chose qui est réalisable en utilisant les bibliothèques standard .net? La search initiale dit non, mais j'espère que j'ai tort.

Vous avez une notion erronée du fonctionnement des requêtes paramétrées. Le "text analysé" dont vous parlez n'est jamais créé et les valeurs des parameters ne sont jamais directement substituées dans la string de requête.

C'est pourquoi il est si important d'utiliser des requêtes paramétrées – vous avez une ségrégation complète des données de requête à partir du code de requête. Les données sont des données, le code est un code, et jamais le twain ne doit se rencontrer. Ainsi, il n'y a pas de possibilité d'injection sql.

Ce que cela signifie est que si vous avez un CommandText comme ceci:

 SELECT SomeColumn FROM SomeTable WHERE ID= @ID 

au lieu d'exécuter une requête qui ressemble à ceci:

 SELECT SomeColumn FROM SomeTable WHERE ID= 123 

vous exécutez en fait quelque chose de plus comme ceci:

 DECLARE @ID Int Set @ID = ResortingeveQueryDataItem("@ID") SELECT SomeColumn FROM SomeTable WHERE ID= @ID 

Maintenant, ce n'est pas exactement ce qui arrive; le moteur ne transforme pas le code comme ça. Au lieu de cela, il utilise la procédure sp_executesql. Mais cela devrait vous aider à comprendre ce qui se passe.

Joel Coehoorn a raison, ce n'est pas seulement une simple substitution de string ou un caractère d'échappement, etc.

Vous pouvez, cependant, voir vos parameters pour voir si vos valeurs sont telles que vous les voulez:

 foreach (IDataParameter i in cmd.Parameters) { Console.WriteLine(i.Value.ToSsortingng()); } 

L'object SQLCommand n'échange pas les parameters pour la valeur dans le text de command et l'exécute. Il appelle le sql sp_execute avec le text exact que vous fournissez et fournit ensuite la list des parameters. Utilisez SQL profiler contre une database et vous verrez ce que je veux dire.

Qu'est-ce que vous essayez réellement d'accomplir ici?

Je serais tenté d'utiliser LINQ car il vous donnera le contrôle que vous voulez dans votre code C #.