Есть ли разница между null и System.DBNull.Value? Если да, то что это?
Я заметил это поведение сейчас -
while (rdr.Read())
{
if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)
{
int x = Convert.ToInt32(rdr["Id"]);
}
}
Пока я извлекаю данные из базы данных с помощью sql datareader, хотя возвращаемое значение не if(rdr["Id"] != null)
возвращается true
и в конечном итоге вызывает исключение для приведения значения null как целого числа.
Но это, если я использую if (rdr["Id"] != System.DBNull.Value)
возврат false
.
В чем разница между null и System.DBNull.Value?
System.Data
, а другой - специальным значением, обозначающим отсутствие референта. Они не имеют ничего общего друг с другом. Не могли бы вы пояснить, в чем вы запутались? Ваш настоящий вопрос "зачем делатьDataRows
иDataReaders
вкладыватьDBNull.Value
внутрь себя, а неnull
?"null
.Ответы:
Ну
null
это не экземпляр какого-либо типа. Скорее, это недействительная ссылка.Однако
System.DbNull.Value
это действительная ссылка на экземплярSystem.DbNull
(System.DbNull
является синглтоном иSystem.DbNull.Value
дает вам ссылку на единственный экземпляр этого класса), который представляет несуществующие * значения в базе данных.* Обычно мы говорим
null
, но я не хочу мешать этому вопросу.Итак, между ними есть большая концептуальная разница. Ключевое слово
null
представляет собой недопустимую ссылку. КлассSystem.DbNull
представляет несуществующее значение в поле базы данных. В общем, мы должны стараться избегать использования одного и того же (в данном случаеnull
) для представления двух очень разных концепций (в данном случае недопустимая ссылка или несуществующее значение в поле базы данных).Имейте в виду, вот почему многие люди выступают за использование шаблона нулевого объекта в целом, что и
System.DbNull
является примером.источник
IDbCommand.ExecuteScalar()
, он может либо вернуть null (записи не возвращаются), либоDbNull
(первый столбец в первой записи - «несуществующее значение»). БезDbNull
вас было бы невозможно отличить одно от другого.Из документации класса DBNull :
источник
DBNull.Value раздражает, когда приходится иметь дело.
Я использую статические методы, которые проверяют, есть ли значение DBNull, а затем возвращают значение.
SqlDataReader r = ...; String firstName = getString(r[COL_Firstname]); private static String getString(Object o) { if (o == DBNull.Value) return null; return (String) o; }
Кроме того, при вставке значений в DataRow вы не можете использовать «null», вы должны использовать DBNull.Value.
Наличие двух представлений «null» - плохой дизайн без видимой выгоды.
источник
DBNull.Value - это то, что возвращают поставщики баз данных .NET для представления нулевой записи в базе данных. DBNull.Value не равен нулю, и сравнения с нулевым значением для значений столбцов, полученных из строки базы данных, не будут работать, вы всегда должны сравнивать с DBNull.Value.
http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx
источник
DataRow имеет метод, который вызывается
IsNull()
, который можно использовать для проверки столбца, если он имеет нулевое значение - относительно нулевого значения, видимого в базе данных.DataRow["col"]==null
всегда будетfalse
.использовать
DataRow r; if (r.IsNull("col")) ...
вместо.
источник
Null похож на нулевой указатель в C ++ . Так что это ссылка, которая не указывает ни на какое значение .
DBNull.Value
полностью отличается и является константой, которая возвращается, когда значение поля содержит NULL.источник