Question

J'ai défini classe Personne Propriété Birthday nullable DateTime? , alors pourquoi pas le travail de l'opérateur coalescent nul dans l'exemple suivant ?

cmd.Parameters.Add(new SqlParameter("@Birthday",
   SqlDbType.SmallDateTime)).Value =       
     person.Birthday ?? DBNull.Value; 

Le err du compilateur je suis arrivé était « Opérateur « ?? » ne peut pas être appliquée aux opérandes de type 'System.DateTime? et 'System.DBNull' »

Ce qui suit a également obtenu une erreur de compilation:

cmd.Parameters.Add(new SqlParameter("@Birthday", 
  SqlDbType.SmallDateTime)).Value = 
   (person.Birthday == null) ? person.Birthday:DBNull.Value;

J'ai ajouté un casting à (objet) tel que recommandé par Refactor, et il a compilé, mais ne fonctionnait pas correctement et la valeur a été enregistrée dans le SQLServer db comme nulle dans les deux cas.

SqlDbType.SmallDateTime)).Value =       
         person.Birthday ?? (object)DBNull.Value;

Quelqu'un peut-il expliquer ce qui se passe ici?

je devais utiliser le code maladroit suivant:

   if (person.Birthday == null) 
    cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value 
      = DBNull.Value;
     else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value = 
          person.Birthday;
Était-ce utile?

La solution

Le problème est que DateTime? et DBNull.Value ne sont pas le même type de sorte que vous ne pouvez pas utiliser l'opérateur coalescent nulle sur eux.

Dans votre cas, vous pouvez faire person.Birthday ?? (object)DBNull.Value passer une valeur de type object jusqu'à Add()

Autres conseils

Je préfère itérer sur mes paramètres avant d'exécuter la requête, la modification de tous les cas de nul à DBNull selon le cas, par exemple:

foreach (IDataParameter param in cmd.Parameters)
    if (param.Value == null)
        param.Value = DBNull.Value;

Cela me permet de laisser des valeurs nulles en l'état et de les échanger simplement en masse plus tard.

Votre premier problème est que pour l'opérateur de ?? ou ?:, les objets pour soit le choix doit être du même type. Ici, ils sont différents types.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top