В чем разница между нулем и System.DBNull.Value? - PullRequest
80 голосов
/ 10 февраля 2011

Есть ли разница между нулем и 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?

Ответы [ 6 ]

102 голосов
/ 10 февраля 2011

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

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

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

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

Сохранить впомните, что именно поэтому многие люди рекомендуют использовать шаблон null в целом, что является именно тем, что System.DbNull является примером.

20 голосов
/ 10 февраля 2011

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

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

10 голосов
/ 26 июня 2012

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

5 голосов
/ 10 февраля 2011

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

3 голосов
/ 10 февраля 2011

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

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

3 голосов
/ 10 февраля 2011

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

использовать

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

вместо.

...