Как мы решаем всю эту неприятность «Преобразование из типа DBNull в тип String»?
В наших приложениях я не могу вспомнить много случаев, когда мы заботимся о пустых строковых полях. Мы просто хотим, чтобы они отображались как пустые строки в большинстве ситуаций.
Поэтому при использовании встроенного набора данных ADO.NET / datatables возникает ошибка:
Преобразование из типа DBNull в тип String недопустимо
это слишком часто встречается позже в приложении при обращении к любым старым строковым данным.
Это особая проблема, потому что она может так легко нас поймать (и часто не замечается при тестировании)
Я знаю, что есть различные решения:
1. Проверьте .IsXXXNull во всех случаях
Но:
это утомительные лишние несколько строк кода по всему приложению
если мы забудем проверку, даже 1 раз из 100, у нас есть потенциальная ошибка
2. В конструкторе набора данных измените свойство NullValue поля со значения по умолчанию «Исключение выброса» на «Пусто»
Но:
мы должны идентифицировать и изменить каждую таблицу и каждое строковое поле, добавляемое в конструктор набора данных (помните, что по умолчанию используется «Throw Exception»)
если мы забудем об изменении хотя бы 1 раз из 100, у нас может скрыться потенциальная ошибка
3. Избегайте хранения нулей в базе данных
Но:
мы должны идентифицировать и изменить каждую таблицу и каждое строковое поле, которое мы добавляем в базу данных
мы не всегда имеем такой контроль над базовыми данными
4. Не используйте конструктор наборов данных, извлекайте данные в наши собственные объекты классов, разбирайтесь со всеми беспорядками DBNull в нашем собственном коде
Но:
да, мы делаем это для наших «основных» таблиц. но конструктор набора данных - это хороший, быстрый способ добавить список выбора или таблицу поиска, где нам действительно нужно только поведение данных по умолчанию5. Используйте генератор кода или инфраструктуру, например CSLA, вместо наборов данных.
Но:
большой шаг для решения небольшой проблемы ... во втором ответе на вопрос с самым высоким рейтингом в CSLA с тегами SO упоминается: «Минусы в том, что у него есть некоторая кривая обучения».