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é?
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.
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).
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
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
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