В чем разница между нулем и System.DBNull.Value?

Есть ли разница между null и System.DBNull.Value? Если да, что это?

Я заметил это поведение сейчас -

while (rdr.Read())
{
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)  
    {
        int x = Convert.ToInt32(rdr["Id"]);
    }
}

Хотя я извлекаю данные из базы данных с помощью средства чтения данных sql, хотя не возвращено значение, if(rdr["Id"] != null) вернуло true и в конечном итоге выдает исключение для приведения значения NULL к целому числу.

Но это, если я использую if (rdr["Id"] != System.DBNull.Value), возвращает false.

В чем разница между нулем и System.DBNull.Value?

79 голосов | спросил pavanred 10 FebruaryEurope/MoscowbThu, 10 Feb 2011 17:33:48 +0300000000pmThu, 10 Feb 2011 17:33:48 +030011 2011, 17:33:48

6 ответов


0

Ну, null не является экземпляром любого типа. Скорее, это недействительная ссылка.

Однако System.DbNull.Value является допустимой ссылкой на экземпляр System.DbNull (System.DbNull является одиночным и System.DbNull.Value дает ссылку на один экземпляр этого класса), который представляет несуществующие значения * в базе данных.

* Обычно мы говорим null, но я не хочу путать проблему.

Итак, между ними есть большая концептуальная разница. Ключевое слово null представляет недопустимую ссылку. Класс System.DbNull представляет несуществующее значение в поле базы данных. В общем, мы должны стараться избегать использования одной и той же вещи (в данном случае null) для представления двух совершенно разных концепций (в данном случае недопустимого ссылка на несуществующее значение в поле базы данных).

Имейте в виду, поэтому многие люди выступают за использование шаблона нулевого объекта в В общем, именно это System.DbNull является примером.

ответил jason 10 FebruaryEurope/MoscowbThu, 10 Feb 2011 17:36:26 +0300000000pmThu, 10 Feb 2011 17:36:26 +030011 2011, 17:36:26
0

Из документации класса DBNull :

  

Не путайте понятие null в объектно-ориентированном языке программирования с объектом DBNull. В объектно-ориентированном языке программирования ноль означает отсутствие ссылки на объект. DBNull представляет неинициализированный вариант или несуществующий столбец базы данных.

ответил Heinzi 10 FebruaryEurope/MoscowbThu, 10 Feb 2011 17:38:37 +0300000000pmThu, 10 Feb 2011 17:38:37 +030011 2011, 17:38:37
0

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" - плохой дизайн без видимой выгоды.

ответил Loathing 26 J0000006Europe/Moscow 2012, 02:34:57
0

DBNull.Value - это то, что возвращают поставщики базы данных .NET, чтобы представить пустую запись в базе данных. DBNull.Value не является нулевым, и сравнение со значением NULL для значений столбцов, извлеченных из строки базы данных, не будет работать, вы всегда должны сравнивать с DBNull.Value.

http://msdn.microsoft.com/en- нас /библиотека /system.dbnull.value.aspx

ответил James Michael Hare 10 FebruaryEurope/MoscowbThu, 10 Feb 2011 17:35:50 +0300000000pmThu, 10 Feb 2011 17:35:50 +030011 2011, 17:35:50
0

В DataRow есть метод с именем IsNull(), который можно использовать для проверки столбца, если он имеет нулевое значение - относительно нулевой, как это видно из базы данных.

DataRow["col"]==null всегда будет false .

использование

DataRow r;
if (r.IsNull("col")) ...

вместо.

ответил Daniel Mošmondor 10 FebruaryEurope/MoscowbThu, 10 Feb 2011 17:37:38 +0300000000pmThu, 10 Feb 2011 17:37:38 +030011 2011, 17:37:38
0

Null похож на нулевой указатель в C ++ . Так что это ссылка , которая не указывает ни на какое значение .

DBNull.Value полностью отличается и является константой , которая возвращается, когда значение поля содержит NULL. /р>

ответил Aliostad 10 FebruaryEurope/MoscowbThu, 10 Feb 2011 17:38:16 +0300000000pmThu, 10 Feb 2011 17:38:16 +030011 2011, 17:38:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132