C# 数据绑定中的可空数据类型?

C# 数据绑定中的可空数据类型?,c#,.net-3.5,ado.net,C#,.net 3.5,Ado.net,我在C#应用程序中使用类型化数据集与数据库通信。我的数据库支持并允许在许多记录上使用空值。然而,试图通过数据集访问空值似乎会导致强制转换异常 是否可以使属性为空(至少是那些可以在数据库中存储空值的属性)?如果不是,为什么它是这样设计的?在这个答案中,他们(MSFT)说类型数据集不支持dot net 4.0中的可空值。可以在.net中创建可空值类型。您可以只使用Nullable泛型还是只使用put?使值类型可为null。我不确定设计器是否为类型化的dataaset自动生成它们。请看 供参考 是否可

我在C#应用程序中使用类型化数据集与数据库通信。我的数据库支持并允许在许多记录上使用空值。然而,试图通过数据集访问空值似乎会导致强制转换异常


是否可以使属性为空(至少是那些可以在数据库中存储空值的属性)?如果不是,为什么它是这样设计的?

在这个答案中,他们(MSFT)说类型数据集不支持dot net 4.0中的可空值。可以在.net中创建可空值类型。您可以只使用Nullable泛型还是只使用put?使值类型可为null。我不确定设计器是否为类型化的dataaset自动生成它们。请看 供参考

是否可以使属性为空

否,生成器工具不支持此操作

如果不是的话,为什么它是这样设计的

数据集可追溯到Fx 1.1,可为空的值类型可追溯到Fx 2.0

Fx2发布时,决定不更改类型化数据集框架(可能是出于成本和时间原因)

数据集框架一直没有更新,因为我认为有一个官方声明,他们正处于生命终结阶段

是否可以使属性为空 (至少有那些可以在数据库中存储空值)

尽管不能在类型化的
数据集中存储可为null的值类型
,但可以使数据集列接受
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;
    }
publicstatict?DBToNullable(对象dbValue),其中T:struct
{
if(dbValue==DBNull.Value)
返回null;
其他的
返回(T)dbValue;
}
公共静态对象NullableToDB(T?值),其中T:struct
{
if(value.HasValue)
返回(对象)(T)值;
其他的
返回DBNull.Value;
}
然后可以这样使用它们:

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

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

    value = DBToNullable<int>(row["MyDataColumn"]);
int?值=。。。。
数据行=。。。。
行[“MyDataColumn”]=NullableToDB(值);
value=DBToNullable(行[“MyDataColumn”]);
这应该会减轻一些痛苦

如果不是的话,为什么它是这样设计的


它的设计可能是出于历史原因,与数据库
NULL
值(意思是:该值未知)和C#
NULL
引用(意思是:该引用尚未分配)之间的概念差异有关。当然,在将可空值类型添加到C#之后,这些含义发生了变化,但到那时,类型化的
数据集
船已经开航了。

有什么原因吗?对于数据库记录来说,空值是完全合理的。传统的事实是,大多数严肃的应用程序一开始都不使用数据集。这一行的东西。它不会在默认情况下或我所知的范围内将可为null的接口添加到值中。这引发了NotSupportedException:“DataSet不支持System.Nullable。”嗨,那段代码让我发笑。这很好,但是值元上的值让它读起来有点奇怪。我认为“if(value.HasValue)return(object)(T)value;”应该是“if(value.HasValue)return value.value;”。返回对象的方法当然不需要显式地向上转换结果。:)