DBNull从DataSet转换为Nullable构造函数

时间:2016-04-21 12:26:39

标签: c# dbnull

我有一个带有签名的构造函数,如下所示:

public Something(UInt64 uid, UInt64? parentUniqueId)
{
    // ...
}

使用数据库检索的结果调用构造函数。 parentUniqueId可能会返回DBNull

目前,调用代码类似于:

var s = new Something(uid: Convert.ToUint64(row[0]), ConvertTo.Unit64(row[1]))

这不起作用,所以我尝试(在第二次演员中)做(Unit64?)row[1];但是,这很吓人。

这里的挑战是Something是一个接受“指定”参数的基类,例如Unit64,它是从接受DataRow的继承类调用的。所以,你可以想象:

public SomethingSpecific(DataRow row)
    : base(
        uid: Convert.ToUInt64(row[0]))
        // etc...
     )
{ }

这可能在一行吗?我如何处理DBNull转换?

2 个答案:

答案 0 :(得分:3)

编写自己的转换方法,如下所示:

public static class MyConvert
{
    public static UInt64? ToUInt64OrNull(object value)
    {
        if(Convert.IsDBNull(value) || value == null)
        {
            return null;
        }
        else
        {
            return Convert.ToUInt64(value);
        }

    }
}

nullDBNull是两个非常不同的值。所以你必须明确处理它们。

然后像这样使用它:

var s = new Something(uid: Convert.ToUInt64(row[0]), MyConvert.ToUInt64OrNull(row[1]))

假设row[0]永远不会是nullDBNull,但row[1]可以是DBNull,并且会作为null传递给构造函数然后

这是您在编写子课时使用它的方法:

public SomethingSpecific(DataRow row)
    : base(
        uid: Convert.ToUInt64(row[0]),
        parentUniqueId: MyConvert.ToUInt64OrNull(row[1])
        // etc...
     )
{ }

答案 1 :(得分:1)

多一点防御性编程怎么样? E.g。

var s = new Something(uid: row[0] != null ? Convert.ToUInt64(row[0]) : default(UInt64), parentUniqueId: row[1] != null ? Convert.ToUInt64(row[1]) : default(UInt64?));

这不好,但它可以解决问题。