В чем разница между null и System.Значение dbnull.Ценность?
есть ли разница между null и System.Значение dbnull.Ценность? Если да, то что это?
я заметил это поведение сейчас -
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 и Система.Значение dbnull.Ценность?
6 ответов:
Ну
null
не является экземпляром любого типа. Скорее, это неверная ссылка.однако,
System.DbNull.Value
, является допустимой ссылкой на экземплярSystem.DbNull
(System.DbNull
является синглтоном иSystem.DbNull.Value
дает вам ссылку на один экземпляр этого класса), который представляет несуществующий* значения в базе данных.*обычно мы говорим
null
, но я не хочу запутать проблему.Итак, есть большая концептуальное различие между ними. Ключевое слово
null
представляет недопустимую ссылку. КлассSystem.DbNull
обозначает несуществующее значение в поле базы данных. В общем, мы должны стараться избегать использования одного и того же (в этом случаеnull
) для представления двух очень разных понятий (в этом случае недопустимая ссылка против несуществующего значения в поле базы данных).имейте в виду, именно поэтому многие люди выступают за использование нулевой объект шаблона в общем, это именно то, что
System.DbNull
пример.
из документации DBNull class:
Не путайте понятие null в объектно-ориентированном языке программирования с объектом DBNull. В объектно-ориентированном языке программирования null означает отсутствие ссылки на объект. DBNull представляет собой неинициализированный вариант или несуществующий столбец базы данных.
DBNull.Значение раздражает, чтобы иметь дело с.
Я использую статические методы, которые проверяют, если это 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.Значение.
иметь два представления "null" - это плохой дизайн без видимой пользы.
DBNull.Значение-это то, что поставщики баз данных .NET возвращают для представления нулевой записи в базе данных. Значение dbnull.Значение не равно null, и сравнение с null для значений столбцов, полученных из строки базы данных, не будет работать, вы всегда должны сравнивать с DBNull.Значение.
http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx