Comments 14
ни один новичок не знает, как работает дотнет под капотом (когда узнает — становится мидлом :) ), с их стороны это вполне разумно и логично.
Лично я столкнулся с этой проблемой, когда писал код формирования кода HTML страницы с большой таблицей данных. И нет, это было не ASP.net. И очень удивлялся тому, как долго страница формируется.
Я не на все 100% уверен в причине, по которой значения NULL из базы данных обрабатываются следующим образом (пожалуйста, прокомментируйте ниже, если знаете!), но Microsoft решил представить их специальным типом DBNull (со статическим полем Value).
Могу ошибаться, но по-моему DBNull в ADO.NET это наследник ADO который был задизайнен до того, как начали разрабатывать .NET
Кроме того, в первых версиях C# красивостей вроде reader.GetString(0) ?? «NULL»; не было и было без разницы с чем сравнивать.
Да и вообще, подозреваю, что изначально null в C# был задизайнен как «пустая ссылка» ибо доступен только ссылочным типам, для value типов была обертка Nullable и то, кажется со второй версии дотнета, ибо дженерики только тогда появились.
Это потом уже, когда сильно часто стали использовать null-ы для value-типов добавили сахару вроде int?
В общем, DBNull.Value просто наследие с древних времен.
Да и пример reader.GetString(0)
не совсем корректен, ведь что если у нас там INT NULLABLE
? Есть метод GetFieldValue<T>
(и даже async-вариант), но я не проверял, умеет ли он в Nullable<T>
.
К тому же, reader.GetString
возвращает string
, а DBNull.Value
— чтож, DbNull
, так что даже этот вариант не сработает — эти типы нельзя между собой сравнивать.
Тьфу.
Не плюйтесь на базовую обертку работы с БД.
Примитивных типов не так много, всегда можно сделать свой generic extension, который будет работать именно так, как вам надо.
DbNull — это со времён ДО Nullable. Ну и обратная совместимость. Кстати, GetXXX() для колонки, в которой «лежит» NULL — вызовет ошибку. Нужно вызывать сперва IsDbNull()
7 опасных ошибок, которые легко совершить в С#/.NET