我在C#应用程序中使用Typed Data set与数据库通信。我的数据库支持并允许许多记录上的空值。但是,似乎尝试通过数据集访问空值会导致Cast异常。
是否可以使属性可以为空(至少可以在数据库中存储空值的属性)?如果不是为什么这样设计呢?
答案 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以供参考