??运算符未在DataTable DataRow中触发System.DBNull类型

时间:2013-05-18 07:51:38

标签: c# .net linq datatable null

这是.Net C# String.Join how to output “null” instead of empty string if element value is null?的后续问题,答案建议使用??运算符来定义自定义空值,但替换永远不会被触发。

DataSet myDataSet = new DataSet();
mySqlDataAdapter.Fill(myDataSet);
DataTable rotationData = myDataSet.Tables["Table"];

rotationValues = string.Join(", ",
    from r in rotationData.Rows.OfType<DataRow>()
    select r[5] ?? "null");

当我将代码更改为:

rotationValues = string.Join(", ",
    from r in rotationData.Rows.OfType<DataRow>()
    select r[5].GetType());

我可以观察到,其中包含有效数据的元素的数据类型为System.Double,而NULL为元素的数据类型为System.DBNull??上的System.DBNull无法运作吗?

2 个答案:

答案 0 :(得分:6)

DBNullnull不是一回事。 但你可以这样写:

select r[5] == DBNull.Value ? "null" : r[5]);

另一种可能性是使用Field扩展方法,它将为您提供对指定行中每个列值的强类型访问,??运算符将起作用。

select r.Field<string>(5) ?? "null";

答案 1 :(得分:3)

??使用编程语言null,而不是数据库DBNull

来自MSDN

  

不要将面向对象编程语言中的null概念与DBNull对象混淆。在面向对象的编程语言中,null表示缺少对对象的引用。 DBNull表示未初始化的变体或不存在的数据库列。