Existe alguma diferença entre null e System.DBNull.Value? Se sim, o que é?
Percebi esse comportamento agora -
while (rdr.Read())
{
if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)
{
int x = Convert.ToInt32(rdr["Id"]);
}
}
Enquanto eu recupero dados do banco de dados usando um datareader sql, nenhum valor foi if(rdr["Id"] != null)
retornado true
e, eventualmente, lançou uma exceção para converter um nulo como inteiro.
Mas, isso se eu usar if (rdr["Id"] != System.DBNull.Value)
retornos false
.
Qual é a diferença entre null e System.DBNull.Value?
System.Data
e o outro é um valor especial que significa a falta de um referente. Eles não têm nada a ver um com o outro. Você pode explicar sobre o que está confuso? A sua verdadeira pergunta é "por que fazerDataRows
eDataReaders
colocarDBNull.Value
dentro de si em vez denull
?"null
.Respostas:
Bem,
null
não é uma instância de qualquer tipo. Em vez disso, é uma referência inválida.No entanto,
System.DbNull.Value
é uma referência válida a uma instância deSystem.DbNull
(System.DbNull
é um singleton eSystem.DbNull.Value
fornece uma referência à única instância dessa classe) que representa valores * inexistentes no banco de dados.* Normalmente diríamos
null
, mas não quero confundir a questão.Portanto, há uma grande diferença conceitual entre os dois. A palavra-chave
null
representa uma referência inválida. A classeSystem.DbNull
representa um valor inexistente em um campo do banco de dados. Em geral, devemos tentar evitar o uso da mesma coisa (neste casonull
) para representar dois conceitos muito diferentes (neste caso, uma referência inválida versus um valor inexistente em um campo do banco de dados).Tenha em mente que é por isso que muitas pessoas defendem o uso do padrão de objeto nulo em geral, que é exatamente o que
System.DbNull
é um exemplo.fonte
IDbCommand.ExecuteScalar()
, pode retornar nulo (nenhum registro retornado) ouDbNull
(a primeira coluna no primeiro registro é um 'valor inexistente'). SemDbNull
você não seria capaz de distinguir um do outro.Da documentação da classe DBNull :
fonte
DBNull.Value é chato de ter que lidar.
Eu uso métodos estáticos que verificam se é DBNull e retornam o valor.
Além disso, ao inserir valores em um DataRow, você não pode usar "null", você deve usar DBNull.Value.
Ter duas representações de "nulo" é um projeto ruim sem benefício aparente.
fonte
DBNull.Value é o que os provedores de banco de dados .NET retornam para representar uma entrada nula no banco de dados. DBNull.Value não é nulo e as comparações com nulo para valores de coluna recuperados de uma linha de banco de dados não funcionarão, você deve sempre comparar com DBNull.Value.
http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx
fonte
DataRow tem um método chamado
IsNull()
que você pode usar para testar a coluna se ela tiver um valor nulo - em relação ao nulo visto pelo banco de dados.DataRow["col"]==null
sempre seráfalse
.usar
em vez de.
fonte
Nulo é semelhante ao ponteiro zero em C ++ . Portanto, é uma referência que não aponta para nenhum valor .
DBNull.Value
é completamente diferente e é uma constante que é retornada quando um valor de campo contém NULL.fonte