web-dev-qa-db-fra.com

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 appel Paramters.Add est la suivante:

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

Où vous devez spécifier le nom du paramètre, la SqlDbType ET la valeur avec .Value.

Maintenant, la syntaxe correcte pour un appel Parameters.AddWithValue est la suivante:

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

Mettez une seule ligne et sautez la partie Type.

Ma question est la suivante: comment se fait-il que lorsque je le fais comme ça,

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

Je ne reçois aucune erreur de compilation et même plus étrange, tout semble fonctionner correctement lorsque le code est exécuté?

47
phadaphunk

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

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

La raison pour laquelle ils ont déconseillé l’ancien en faveur de AddWithValue est pour ajouter une clarté supplémentaire, ainsi que parce que le deuxième paramètre est object, ce qui permet de ne pas voir tout de suite quelle surcharge de Add a été appelée, et ils ont abouti à des résultats très différents comportement.

Jetez un oeil à cet exemple:

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

À première vue, il semble qu’on appelle la surcharge Add(string name, object value), mais ce n’est pas . Il appelle la surcharge Add(string name, SqlDbType type)! En effet, 0 est implicitement convertible en types enum. Donc, ces deux lignes:

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

et

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

En réalité, deux méthodes différentes sont appelées. 1 n'est pas convertible en une énumération implicitement, il choisit donc la surcharge object. Avec 0, il choisit la surcharge enum.

75
vcsjones

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 c'est plus explicite, mais AddWithValue pour des scénarios de type plus simples (Int à Int). 

8
Dennis Rongo

Sans fournir explicitement le type dans command.Parameters.Add("@ID", SqlDbType.Int);, il tentera de convertir implicitement l'entrée en ce qu'elle attend. 

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

3
Khan

lorsque nous utilisons CommandObj.Parameter.Add (), il prend 2 paramètres de procédure et 2, le type 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

1

Il n'y a pas de différence en termes de fonctionnalité


La méthode addwithvalue prend un objet comme valeur. Il n'y a pas de vérification du type de données. Potentiellement, cela pourrait entraîner une erreur si le type de données ne correspond pas à la table SQL. La méthode add nécessite que vous spécifiiez d'abord le type de base de données. Cela aide à réduire ces erreurs.

Pour plus de détails S'il vous plaît cliquez ici

0
Brijesh Mavani