我在我的C#应用程序中使用了类型化数据集来与数据库进行通信。我的数据库支持并允许在许多记录上使用空值。但是,似乎试图通过数据集访问空值会导致Cast异常。数据绑定中的可为空的数据类型?
是否可以使属性为空(至少可以在数据库中存储空值的属性)?如果不是为什么这样设计?
我在我的C#应用程序中使用了类型化数据集来与数据库进行通信。我的数据库支持并允许在许多记录上使用空值。但是,似乎试图通过数据集访问空值会导致Cast异常。数据绑定中的可为空的数据类型?
是否可以使属性为空(至少可以在数据库中存储空值的属性)?如果不是为什么这样设计?
是否有可能使性能可为空
没有,Generator工具不支持此。
如果不是为什么它是这样设计的?
数据集的历史可以追溯到Fx的1.1,空值类型,以FX 2.0
当FX2发布决定不给(大概是成本和时间的原因)改变类型化数据集架构。
数据集框架还没有更新,因为我认为有一个正式声明他们处于生命周期结束阶段。
在这个答案 - Typed DataSet nullable support他们(MSFT)说类型的数据集不支持点网4.0
有可能在.NET创建空值类型空的值。你可以只使用Nullable通用或只是放?使值类型为空。我不确定设计师是否自动为类型化数据集生成它们。请看看 http://xtremebytes.blogspot.com/2010/12/nullable.html参考
根据我的预测,它不会将Nullable的
是否可以使属性为空 (至少可以在数据库中存储空值的那些属性)?
虽然不能存储在一个类型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#之后发生了变化,但到那时键入的号码已经驶出。
给出原因的原因是什么?对于数据库记录,空值是完全合理的。 – Malfist 2011-01-07 20:00:55
传统,事实是最严重的应用程序不使用数据集开始。东西沿这条线。 – TomTom 2011-01-07 20:08:02