Доступ к базе данных C#: DBNull vs null

У нас есть собственная ORM, которую мы используем здесь, и предоставляем строго типизированные оболочки для всех наших таблиц db. Мы также разрешаем выполнение слабо типизированного специального SQL, но эти запросы по-прежнему проходят через один и тот же класс для получения значений из устройства чтения данных.

Настраивая этот класс для работы с Oracle, мы столкнулись с интересным вопросом. Что лучше: DBNull.Value или null? Есть ли преимущества от использования DBNull.Value? Кажется более «правильным» использовать null, поскольку мы отделились от мира БД, но есть последствия (вы не можете просто слепо, ToString() когда значение null, например), так что это определенно то, что нам нужно сделать осознанным решение о.

Ответов (4)

Решение

Я считаю, что лучше использовать null вместо DB null.

Причина в том, что, как вы сказали, вы отделяете себя от мира БД.

Обычно рекомендуется проверять ссылочные типы, чтобы убедиться, что они все равно не равны нулю. Вы собираетесь проверять наличие null для других вещей, кроме данных БД, и я считаю, что лучше всего сохранить согласованность в системе и использовать null, а не DBNull .

В конечном итоге с точки зрения архитектуры я считаю это лучшим решением.

По моему опыту, .NET DataTables и TableAdapters лучше работают с DBNull. Он также открывает несколько специальных методов, когда он строго типизирован, например DataRow.IsFirstNameNull, когда он на месте.

Я хотел бы дать вам лучший технический ответ, чем этот, но для меня главное - использовать DBNull при работе с объектами, связанными с базой данных, а затем использовать «стандартный» null, когда я имею дело с объектами и кодом, связанным с .NET.

Используйте DBNull .
Мы столкнулись с некоторыми проблемами при использовании null.
Если я правильно помню, вы не можете ВСТАВИТЬ нулевое значение в поле, только DBNull.
Может быть связано только с Oracle, извините, я больше не знаю подробностей.

Если вы написали свой собственный ORM, я бы сказал, просто используйте null, так как вы можете использовать его, как хотите. Я считаю, что DBNull изначально использовался только для того, чтобы обойти тот факт, что типы значений (int, DateTime и т. Д.) Не могут быть нулевыми, поэтому вместо того, чтобы возвращать какое-то значение, такое как ноль или DateTime.Min, что означало бы нулевое значение (плохо, плохо ), они создали DBNull, чтобы указать на это. Может быть, это было что-то еще, но я всегда предполагал, что причина в этом. Однако теперь, когда у нас есть типы, допускающие значение NULL, в C# 3.0 больше нет необходимости в DBNull. Фактически, LINQ to SQL просто повсюду использует null. Совершенно никаких проблем. Примите будущее ... используйте null. ;-)