É dbnull.value necessário para tipos anuláveis como sqlCommandParameter.value
Pergunta
Qual abordagem é recomendada:
void Add(int? value)
{
command.Parameters.Add("@foo").Value = value;
}
ou
void Add(int? value)
{
command.Parameters.Add("@foo").Value = (object)value ?? DBNull.Value;
}
Solução
Se você quiser passar um valor nulo em um parâmetro, você precisa passar DBNull.Value
como no seu segundo exemplo.
Se você atribuir null
Como o valor do parâmetro, o parâmetro não será enviado ao procedimento, o que fará com que a chamada do procedimento falhe (se o parâmetro for necessário) ou usará o valor padrão para o parâmetro, que pode ou não ser nulo.
Outras dicas
Depende da funcionalidade que você deseja.
Se você passar null
Como o valor, o SQLCommand tratará o mesmo que se o parâmetro não tivesse sido aprovado. Se for um parâmetro necessário, por exemplo, um procedimento armazenado, isso fará com que sua consulta falhe.
Se você passar DBNull.Value
Em seguida, o SQLCommand tratará isso como o SQL NULL sendo passado.