我有一个 Oracle 数据表,获取的列为空。所以我想保持代码的美观和简单,我会使用 ??操作数。AlternatePhoneNumber 是我的 C# 模型中的一个字符串。

AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""

但是,即使使用该代码我仍然收到错误。

System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.

我知道该错误意味着什么,但为什么?不能在 DBNull 上使用?null 和 DBNull 本质上不是一样的吗?

谢谢。

有帮助吗?

解决方案

?? 运算符仅适用于实际 nulls。

nullDBNull.Value 不一样; DBNull.Value 只是一个占位符对象。

此外,该异常来自内部 AlternatePhoneNumber 财产,在你之前 ?? 运算符执行。(您的代码没有强制转换)。

如果 customer 是类型化数据集中的一行,更改列的 NullValue 设计师的财产。

其他提示

null和dbnull不相同。system.dbnull是一个实际对象。

问题是 AlternatePhoneNumber 是一个字符串。DBNull 不是。

试试这个:

AlternatePhoneNumber = (customer.AlternatePhoneNumber as string) ?? ""

这样做:

public T IfNull<T>(object o, T value)
{
   return (o == DbNull.Value) ? value : (T)o;       
}
.

DBNull 是一种具有单个值的类型,与空字符串引用不同,这就是为什么您不能使用 ??. 。不过你可以这样做:

string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;

正如其他回复所述, null 表示没有引用任何对象的引用,而 DBNull 是 ADO.NET 提供的一个类 表明 当数据库(或数据表)中的字段或值为 NULL 时。

虽然您可以使用 条件(三元)运算符 (?:) 做你想做的事:

AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull 
                           ? "" 
                           : customer.AlternatePhoneNumber;

我倾向于将其概括为 扩展方法:

static class NullExtensions
{
    public static T WhenNull<T>( this object value, T whenNullValue )
    {
        return (value == null || value is DBNull)
            ? whenNullValue
            : (T)value;
    }
}

我发现这使得代码更容易阅读和理解。

AlternatePhoneNumber = customer.AlternatePhoneNumber.WhenNull( "" );

dbnull不是一个真正的“null”。

“??” - 运算符仅检测为null - 引用,而不是模拟“空”行为的对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top