2010-02-27 19 views
3

Quelle approche est recommandée:est-DBNull.Value nécessaire pour les types nullable comme SqlCommandParameter.Value

void Add(int? value) 
{ 
    command.Parameters.Add("@foo").Value = value; 
} 

ou

void Add(int? value) 
{ 
    command.Parameters.Add("@foo").Value = (object)value ?? DBNull.Value; 
} 
+1

Le code dans votre deuxième exemple ne compile pas - à la place, vous obtenez "Opérateur '??' ne peut pas être appliqué à des opérandes de type 'int?' et 'System.DBNull'. " Pour que cela fonctionne, vous devez convertir la valeur en objet, par ex. '(objet) valeur ?? DBNull.Value; '. –

+0

@Mike Powell: Salut. En effet, vous avez raison. Mon code existant est exactement comme vous l'avez mentionné. J'ai juste oublié de l'écrire correctement. – abatishchev

Répondre

4

Si vous voulez passer une valeur NULL dans un paramètre, vous devez passez DBNull.Value comme dans votre deuxième exemple.

Si vous affectez null comme valeur de paramètre, le paramètre ne sera pas envoyé à la procédure, ce qui fera échouer l'appel de procédure (si le paramètre est requis) ou utiliser la valeur par défaut du paramètre, qui peut ou peut ne pas être nul.

1

Cela dépend de la fonctionnalité que vous voulez.

Si vous transmettez la valeur null, SqlCommand traitera la même chose que si le paramètre n'avait pas été passé du tout. Si c'est un paramètre obligatoire dans, par exemple, une procédure stockée, cela provoquera l'échec de votre requête.

Si vous transmettez DBNull.Value, SqlCommand traitera cela comme une valeur SQL nulle.