Pregunta

Me han definido Clase persona propiedad cumpleaños como Fecha y hora anulable? , el trabajo del operador ¿por qué no debería la nula coalescencia en el ejemplo siguiente ?

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

El err compilador que obtuve fue "Operador '??' no se puede aplicar a operandos de tipo 'System.DateTime?' y 'System.DBNull'"

La siguiente también consiguió un error de compilación:

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

He añadido un yeso para (objeto) según lo recomendado por Refactor, y compilado, pero no funcionaba correctamente y el valor se almacena en la base de datos SQL Server como nulo en ambos casos.

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

Puede alguien explicar lo que está pasando aquí?

que necesitaba usar el siguiente código torpe:

   if (person.Birthday == null) 
    cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value 
      = DBNull.Value;
     else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value = 
          person.Birthday;
¿Fue útil?

Solución

El problema es que DateTime? y DBNull.Value no son del mismo tipo por lo que no puede utilizar la nula coalescencia operador en ellos.

En su caso se puede hacer person.Birthday ?? (object)DBNull.Value para pasar un valor de tipo object a través de Add()

Otros consejos

Yo prefiero iterar sobre mis parámetros justo antes de ejecutar la consulta, el cambio de todas las instancias de nula a DBNull según el caso, por ejemplo:

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

Esto me permite valores nulos dejo tal cual y simplemente intercambiar de forma masiva más tarde.

Su primer problema es que para el operador ?? o ?:, los objetos de una u otra opción deben ser del mismo tipo. Aquí son de tipo diferente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top