将可为空的数据类型分配给表列时“DataSet 不支持 System.Nullable”

问题描述 投票:0回答:2

我需要在数据表的某些列中放入空值。空值并不意味着 DBNull 值,而是严格的 null 值。因此,出于此目的,我按如下方式分配列的数据类型:

myTable.Columns.Add("MyCol", typeof(decimal?));
但编译器说“DataSet 不支持 System.Nullable<>”。

有什么办法可以解决这个问题吗?我不想在表中插入值时用零替换空值,如下所示:

myRow["MyCol"] = val == null ? 0m : val;
因为插入的值是否为空会对我的程序产生影响。我也无法在插入值时用 DBNulls 代替 null,如下所示:
myRow["MyCol"] = val == null ? DBNull.Value : (decimal?)val;
因为编译器显示“错误 CS0173:无法确定条件表达式的类型,因为‘System.DBNull’和‘十进制’之间没有隐式转换?”

我用谷歌搜索了这个问题,发现只有两个类似的案例: https://bytes.com/topic/c-sharp/answers/514233-adding-nullable-datetime-column-datatable-does-not-work https://www.tek-tips.com/viewthread.cfm?qid=1542262 然而,两者都没有适合我的解决方案。

所以,我可以发明的唯一选择是当该值为空时不分配该值:

if (val != null) myRow["MyCol"] = val;

这是唯一的方法吗?而且真的没有办法让DataSet支持System.Nullable吗,所以代码

myTable.Columns.Add("MyCol", typeof(decimal?));
有效吗?

c# dataset nullable
2个回答
0
投票

您需要使用小数并为该列指定“AllowDBNull = true”。

或者使用实体框架。


0
投票

感谢 JHBonarius,我从其中一个答案中得到了主要思想: 在 System.Data.DataTable 中将列定义为可为空 这个想法是将所有内容都转换为对象。首先,不需要将表列的AllowDBNull 属性设置为true,因为它默认为true。其次,由于编译器错误 CS0173,我坚持使用了代码行

myRow["MyCol"] = val == null ? DBNull.Value : (decimal?)val;
。这里的解决方案是将两个部分都转换为对象,如下所示:
myRow["MyCol"] = val == null ? (object)DBNull.Value : (object)val
这可以正常工作,并且 DBNull 值会插入到表列中。就是这样。

© www.soinside.com 2019 - 2024. All rights reserved.