Обнуляемые типы данных в привязке данных? - PullRequest
4 голосов
/ 07 января 2011

Я использую наборы типизированных данных в своем приложении C # для связи с базой данных. Моя база данных поддерживает и допускает нулевые значения для многих записей. Однако, похоже, что попытка получить доступ к обнуленному значению через набор данных приводит к исключению Cast.

Можно ли сделать свойства обнуляемыми (по крайней мере, те, которые могут хранить нулевое значение в базе данных)? Если нет, то почему он был спроектирован таким образом?

Ответы [ 4 ]

1 голос
/ 07 января 2011

Можно ли сделать свойства обнуляемыми (по крайней мере те, которые могут хранить нулевое значение в базе данных)?

Хотя вы не можете хранить типы значений, допускающие значение NULL, в типизированном DataSet, вы можете заставить столбцы набора данных принимать значения DBNull (column.AllowDBNull = true;) и создать пару вспомогательных функций, которые будут выполнятьэтот перевод для вас.

    public static T? DBToNullable<T>(object dbValue) where T: struct 
    {
        if (dbValue == DBNull.Value)
            return null;
        else
            return (T)dbValue;
    }

    public static object NullableToDB<T>(T? value) where T: struct
    {
        if (value.HasValue)
            return (object)(T)value;
        else
            return DBNull.Value;
    }

Затем их можно использовать так:

    int? value = ....
    DataRow row = ....

    row["MyDataColumn"] = NullableToDB(value);

    value = DBToNullable<int>(row["MyDataColumn"]);

Это должно немного облегчить боль.

Если нет, то почемубыл ли он спроектирован таким образом?

Вероятно, он был спроектирован таким образом по историческим причинам, которые относятся к концептуальной разнице между значением NULL базы данных (то есть: значение неизвестно) и C # null ссылка (имеется в виду: эта ссылка еще не была назначена).Конечно, эти значения изменились после того, как в C # были добавлены типы значений, которые можно обнулять, но к тому времени набранный корабль DataSet уже отплыл.

1 голос
/ 07 января 2011

Можно ли сделать свойства обнуляемыми

Нет, инструмент «Генератор» не поддерживает это.

Если нет, то почему он был разработан таким образом?

Набор данных восходит к Fx 1.1, типы значений Nullable - к Fx 2.0

Когда Fx2 был выпущен, было решено не изменять структуру Typed Dataset (предположительно по соображениям стоимости и времени).

Платформа набора данных не обновлялась с тех пор, я думаю, что где-то есть официальное заявление, что они находятся на стадии окончания срока службы.

1 голос
/ 07 января 2011

В этом ответе - Типизированная поддержка DataSet обнуляемая поддержка они (MSFT) говорят, что набор данных типа не поддерживает обнуляемые значения в dot net 4.0

0 голосов
/ 07 января 2011

Можно создавать типы значений Nullable в .NET. Вы можете просто использовать Nullable generic или просто положить? сделать тип значения обнуляемым. Я не уверен, что дизайнер генерирует их автоматически для типизированного набора данных. Пожалуйста, посмотрите на http://xtremebytes.blogspot.com/2010/12/nullable.html для справки

...