В чем разница между 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 77

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

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

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

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

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

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

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