2011-01-07 69 views
4

我在我的C#应用​​程序中使用了类型化数据集来与数据库进行通信。我的数据库支持并允许在许多记录上使用空值。但是,似乎试图通过数据集访问空值会导致Cast异常。数据绑定中的可为空的数据类型?

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

回答

1

是否有可能使性能可为空

没有,Generator工具不支持此。

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

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

当FX2发布决定不给(大概是成本和时间的原因)改变类型化数据集架构。

数据集框架还没有更新,因为我认为有一个正式声明他们处于生命周期结束阶段。

1

在这个答案 - Typed DataSet nullable support他们(MSFT)说类型的数据集不支持点网4.0

+0

给出原因的原因是什么?对于数据库记录,空值是完全合理的。 – Malfist 2011-01-07 20:00:55

+1

传统,事实是最严重的应用程序不使用数据集开始。东西沿这条线。 – TomTom 2011-01-07 20:08:02

0

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

+0

根据我的预测,它不会将Nullable的接口添加到默认或永远的值。 – Malfist 2011-01-07 20:16:31

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#之后发生了变化,但到那时键入的号码已经驶出。