Как мне обработать преобразование DBNull в Boolean в моем XSD DataSet?

StackOverflow https://stackoverflow.com/questions/445136

  •  22-07-2019
  •  | 
  •  

Вопрос

В моей базе данных у меня есть несколько столбцов в одной из моих таблиц, которые имеют битовые (логические) значения. Им разрешено быть НЕДЕЙСТВИТЕЛЬНЫМИ, так как поля не всегда будут содержать данные.

Я прошел процесс создания набора данных XSD с помощью таблицы и убедился, что для поля AllowDBNull установлено значение True.

Однако, когда я извлекаю запись из базы данных в таблицу данных с использованием настроенного метода GetData, я сталкиваюсь со следующей ошибкой:

[InvalidCastException: Conversion from type 'DBNull' to type 'Boolean' is not valid.]

Нужно ли указывать что-то другое, кроме поля DefaultValue для столбца, или есть какое-то другое поле для установки?

Я все еще в стадии разработки с этим проектом, поэтому, если вы предпочитаете менять поля на символы и использовать опцию Y / N / NULL, я не слишком против этого.

Это было полезно?

Решение

ИМХО, вы не должны разрешать пустые значения в битовом / логическом поле.

У Майка Хэдлоу есть хороший пост на эту тему:

http://mikehadlow.blogspot.com/2006/10/nullability -voodoo.html

Boolean по определению является типом с двумя состояниями. Делая его обнуляемым, вы добавляете третье состояние. Он вернется, чтобы преследовать вас в какой-то момент.

Другие советы

Я должен не согласиться с Иэйном. Логика с тремя значениями так же жизнеспособна, как и логика с двумя значениями. Человек за столом жив или мертв, или вы не знаете, жив он или мертв. Если бы у Майка был свой путь, ты не мог бы использовать немного здесь. Вам понадобится FK для таблицы состояния, 1 = живой, 2 = мертвый, 3 = неизвестный.

Целью бита является экономия места. Вы всегда можете сделать столбец CHAR (1) с ограничением, ограничивающим значения T или F, Y или N (или U).

Но я думаю, что Иэн неправильно истолковывает слова Майка. Майк не препятствует использованию Null, в конце концов он думает, что столбец EndDate должен быть нулевым, пока процесс не будет завершен. Он просто говорит: не наполняйте пустое значение в столбце мистическими свойствами ... как будто это ключ к знанию, находится ли процесс в определенном состоянии.

На самом деле, нулевые значения в базе данных имеют некоторые очень полезные побочные эффекты. Oracle (возможно, другие базы данных) не индексирует нули. Поэтому если у вас есть столбец, в котором важно только одно значение, например, у вас есть список сотрудников, который вы никогда не чистите, и битовый столбец Is_Active_Employee, который проиндексирован. В этом случае для установленного бизнеса число ваших сотрудников составляет > > > чем количество сотрудников у вас сейчас. Скажем, у вас есть 1% 1 и 99% 0.

Этот индекс в 99 раз больше, чем нужно. Он индексирует все 1, что хорошо, так как они составляют 1% от таблицы, но он также загружен 0 для строк, которые НИКОГДА НЕ МОЖЕТЕ использовать этот индекс для поиска. Если вы хотите, чтобы все неактивные сотрудники были проиндексированы, они игнорировались и выполнялась FTS. Так что 1 и NULL были бы НАМНОГО более эффективными с точки зрения базы данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top