Différence entre les Paramètres.Ajouter(string, object) et de Paramètres.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, la SqlDbType
ET de la Valeur avec .Value
.
Maintenant la syntaxe correcte pour une Parameters.AddWithValue
appel :
command.Parameters.AddWithValue("@demographics", demoXml);
Seule ligne et passez la 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é ?
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de différence en termes de fonctionnalité. En fait, les deux ce faire:
La raison pour laquelle ils obsolète le vieux un en faveur de l'
AddWithValue
est d'ajouter plus de clarté, ainsi que parce que le deuxième paramètre estobject
, ce qui le rend pas immédiatement évident pour certaines personnes qui surcharge deAdd
a été appelé, et ils ont abouti à sauvagement comportement différent.Prendre un coup d'oeil à cet exemple:
Au premier coup d'œil, on dirait que c'est l'appel de la
Add(string name, object value)
surcharge, mais il n'est pas. C'est l'appel de laAdd(string name, SqlDbType type)
surcharge! C'est parce que 0 est implicitement convertible types enum. Donc, ces deux lignes:et
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 laobject
de surcharge. Avec0
, il choisit l'enum de surcharge.La différence est la conversion implicite lors de l'utilisation de AddWithValue. Si vous savez que votre exécution de la requête SQL (procédure stockée) accepte une valeur de type int, nvarchar, etc, il n'y a pas de raison de re-déclarer dans votre code.
De type complexe scénarios (exemple serait DateTime, float), je vais probablement utiliser Ajouter comme il est plus explicite, mais AddWithValue pour plus straight-forward type de scénarios (Int, Int).
Sans prévoir expressément que le type en
command.Parameters.Add("@ID", SqlDbType.Int);
, il va essayer de convertir implicitement l'entrée à quoi il s'attend.Le revers de la médaille, c'est que la conversion implicite peut-être pas la plus optimale de conversions et peut entraîner un gain de performance.
Il y a une discussion sur ce sujet ici:
http://forums.asp.net/t/1200255.aspx/1
lorsque nous utilisons CommandObj.Le paramètre.Ajouter (), il se 2 premier paramètre est le paramètre de la procédure et le second est son type de données, mais .AddWithValue() prendre 2 premier paramètre est le paramètre de la procédure et la deuxième est la variable de données
//pour .AddWithValue
où ID est le paramètre de la procédure Stockée qui type de données est de type Int
Il n'y a pas de différence en termes de fonctionnalité
Le
addwithvalue
méthode prend un objet en tant que valeur. Il n'y a pas de type de données type de vérification. Potentiellement, cela pourrait conduire à une erreur si le type de données ne correspond pas à la table SQL. Leadd
méthode nécessite de spécifier le type de Base de données en premier. Cela permet de réduire ces erreurs.Pour plus de détails Veuillez cliquer ici