数据绑定中可以为空的数据类型?

时间:2011-01-07 19:54:39

标签: c# .net-3.5 ado.net

我在C#应用程序中使用Typed Data set与数据库通信。我的数据库支持并允许许多记录上的空值。但是,似乎尝试通过数据集访问空值会导致Cast异常。

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

4 个答案:

答案 0 :(得分:1)

在这个答案中 - Typed DataSet nullable support他们(MSFT)说类型数据集不支持dot net 4.0中的可空值

答案 1 :(得分:1)

  

是否可以使属性可以为空?

不,Generator工具不支持此功能。

  

如果不是为什么这样设计?

数据集的历史可以追溯到Fx 1.1,可以为Nx的值类型为Fx 2.0

当Fx2发布时,决定不更改Typed Dataset框架(可能是出于成本和时间原因)。

数据集框架尚未更新,因为我认为在他们正处于人生临终阶段的某个地方有一个官方声明。

答案 2 :(得分:1)

  

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

虽然您无法在类型为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船已经航行。

答案 3 :(得分:0)

可以在.NET中创建Nullable值类型。你可以只使用Nullable泛型或只是放?使值类型可以为空。我不确定设计者是否自动为类型化数据集生成它们。请看 http://xtremebytes.blogspot.com/2010/12/nullable.html以供参考