Pergunta

Eu defini aula Pessoa propriedade Aniversário Como Nullable DateTime? , então por que o operador nulo de coalesce não deve funcionar no exemplo a seguir?

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

O compilador Err que eu recebi foi "Operador '??' Não pode ser aplicado aos operando do tipo 'System.DateTime?' e 'System.dbnull' "

O seguinte também recebeu um erro de compilação:

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

Adicionei um elenco a (objeto) recomendado pelo Refactor, e ele compilou, mas não funcionou corretamente e o valor foi armazenado no sqlserver db como nulo em ambos os casos.

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

Alguém pode explicar o que está acontecendo aqui?

Eu precisava usar o seguinte código Clumsy:

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

Solução

O problema é que DateTime? e DBNull.Value não são do mesmo tipo, então você não pode usar o operador nulo de coalescantes neles.

No seu caso, você pode fazer person.Birthday ?? (object)DBNull.Value Para passar um valor do tipo object através de Add()

Outras dicas

Prefiro iterar sobre meus parâmetros antes de executar a consulta, alterando todas as instâncias de nulo para dbnull conforme apropriado, por exemplo:

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

Isso me permite deixar valores nulos como é e simplesmente trocá-los em massa mais tarde.

Seu primeiro problema é o para o ?? ou ?: Operador, os objetos para qualquer opção devem ser o mesmo tipo. Aqui eles são do tipo diferente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top