Подтвердить что ты не робот

В чем разница между null и 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"]);
    }
}

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

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

Какая разница между null и System.DBNull.Value?

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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.

Имеют два представления "нуль" - плохой дизайн без видимых преимуществ.

Ответ 4

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

http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx

Ответ 5

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

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

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

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

вместо.

Ответ 6

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

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