2011-10-07 2 views
3

Compte tenu de la ligne de code suivante:Problèmes avec le constructeur SqlParameter vs objet initialiseur

cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayID); 

Je reçois l'erreur suivante: Le SqlParameterCollection accepte uniquement les objets de type SqlParameter non null, pas des objets String.

Cependant, la réécriture à utiliser l'objet initialisation:

cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar) { Value = customer.DisplayID }); 

fonctionne très bien. Un pointeur sur pourquoi cela se produit?

+0

Peut-être parce que customer.DisplayId est null et SqlDbType.NVarChar n'accepte pas les valeurs nulles. – CharithJ

Répondre

2

Le problème est une parenthèse fermante mal placée:

cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar)).Value = customer.DisplayId; 

Notez qu'il existe 2 parenthèses de fermeture avant .Value. Comme vous l'origine entré, vous faites cmd.Parameters.Add(...); où le ... est

new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayId

et qui sera évalué à customer.DisplayId, d'où le message à ce sujet ne pas accepter string types.

En outre, vous pouvez ajouter le paramètre plus succinctement

cmd.Parameters.AddWithValue("@displayId", customer.DisplayId); 

Quant à savoir pourquoi new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayId retours customer.DisplayId, considérer que la assignment operator retourne la valeur assignée comme résultat, et dans ce cas qui être customer.DisplayId. Ceci est la raison pour laquelle vous pouvez attribuer une valeur à plusieurs variables à la fois:

int i, j, k; 
i = j = k = 42; 
2
cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayID); 

est le même que

var customerDisplayId = customer.DisplayID; 
new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customerDisplayId; 
cmd.Parameters.Add(customerDisplayId); 

ne vous voyez maintenant pourquoi le compilateur se plaint?

Questions connexes