Как мне обработать преобразование DBNull в Boolean в моем XSD DataSet? - PullRequest
2 голосов
/ 15 января 2009

В моей базе данных у меня есть несколько столбцов в одной из моих таблиц, которые имеют битовые (логические) значения. Они могут иметь значение NULL, так как поля не всегда будут содержать данные.

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 11 февраля 2009

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

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

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

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

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

1 голос
/ 15 января 2009

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

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

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

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

...