52 votes

Différence entre Parameters.Add et Parameters.AddWithValue

J'ai lu la documentation MSDN et des exemples ici et je sais que la syntaxe correcte pour un Paramters.Add appel :

   command.Parameters.Add("@ID", SqlDbType.Int);
   command.Parameters["@ID"].Value = customerID; 

Où vous devez spécifier le Nom du Paramètre, l' SqlDbType ET la Valeur .Value.

Maintenant la syntaxe correcte pour un Parameters.AddWithValue appel :

   command.Parameters.AddWithValue("@demographics", demoXml);

Seule ligne et de passer l' Type partie.

Ma Question est : Comment est-il que quand je le fais comme ça,

   command.Parameters.Add("@demographics", demoXml);
   // .Add method with .AddWithValue syntax

Je n'ai aucune erreur de compilation et encore plus étrange, tout semble fonctionner correctement lorsque le code est exécuté ?

78voto

vcsjones Points 51910

Il n'y a pas de différence en termes de fonctionnalité. En fait, les deux ce faire:

return this.Add(new SqlParameter(parameterName, value));

La raison pour laquelle ils obsolète le vieux un en faveur de l' AddWithValue est à ajouter plus de clarté, ainsi que parce que le deuxième paramètre est object, ce qui le rend pas immédiatement évident pour certaines personnes qui surcharge d' Add a été appelé, et ils ont abouti à sauvagement comportement différent.

Jetez un oeil à cet exemple:

 SqlCommand command = new SqlCommand();
 command.Parameters.Add("@name", 0);

Au premier coup d'œil, on dirait que c'est l'appel de la Add(string name, object value) de surcharge, mais il n'est pas. C'est l'appel de la Add(string name, SqlDbType type) de surcharge! C'est parce que 0 est implicitement convertible types enum. Donc, ces deux lignes:

 command.Parameters.Add("@name", 0);

et

 command.Parameters.Add("@name", 1);

Résultent en fait de deux méthodes différentes d'être appelé. 1 n'est pas convertible en un enum implicitement, il choisit donc l' object de surcharge. Avec 0, il choisit l'enum de surcharge.

9voto

Dennis Rongo Points 2772

La différence est la conversion implicite lors de l'utilisation de AddWithValue. Si vous savez que votre requête SQL en cours d'exécution (procédure stockée) accepte une valeur de type int, nvarchar, etc., il n'y a aucune raison de la re-déclarer dans votre code.

Pour les scénarios de type complexes (par exemple, DateTime, float), j'utiliserai probablement Add car il est plus explicite que AddWithValue pour des scénarios de type plus simples (Int à Int).

3voto

Khan Points 8610

Sans fournir explicitement le type sous la forme command.Parameters.Add("@ID", SqlDbType.Int); , il tentera de convertir implicitement l'entrée en ce qui est attendu.

L'inconvénient est que la conversion implicite n'est peut-être pas la conversion optimale et peut entraîner un impact négatif sur les performances.

Il y a une discussion sur ce sujet même ici: http://forums.asp.net/t/1200255.aspx/1

2voto

Lorsque nous utilisons CommandObj.Parameter.Add (), il prend 2 paramètres de procédure et 2, le type de données, mais .AddWithValue () prend 2 paramètres de procédure et 2, variables de données.

 CommandObj.Parameter.Add("@ID",SqlDbType.Int).Value=textBox1.Text;
 

// pour .AddWithValue

 CommandObj.Parameter.AddWitheValue("@ID",textBox1.Text);
 

où ID est le paramètre de la procédure stockée dont le type de données est Int

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X