В .NET есть ссылка null, которая используется везде, чтобы обозначить, что ссылка на объект пуста, а затем есть DBNull, который используется драйверами базы данных (и несколькими другими) для обозначения... почти такой же. Естественно, это создает много путаницы, и процедуры конвертирования должны быть отменены и т.д.
Итак, почему оригинальные авторы .NET решили сделать это? Для меня это бессмысленно. Их документация также не имеет смысла:
Класс DBNull представляет несуществующее значение. Например, в базе данных столбец в строке таблицы может не содержать каких-либо данных. То есть, столбец, как считается, не существует вообще, а не просто не имеет значения. Объект DBNull представляет несуществующий столбец. Кроме того, COM interop использует класс DBNull для различения варианта VT_NULL, который указывает несуществующее значение, и вариант VT_EMPTY, который указывает неопределенное значение.
Что это за дерьмо о столбце, который не существует? Столбец существует, он просто не имеет значения для конкретной строки. Если он не существует, я получаю исключение, пытающееся получить доступ к определенной ячейке, а не DBNull! Я могу понять необходимость различать VT_NULL и VT_EMPTY, но почему бы не сделать вместо этого класс COMEmpty? Это было бы очень аккуратно подходит для всей платформы .NET.
Я что-то упустил? Может ли кто-нибудь пролить свет, почему был изобретен DBNull и какие проблемы он может решить?