c# - DBNull 从 DataSet Cast 到 Nullable 构造函数

标签 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 转换?

最佳答案

像这样编写你自己的转换方法:

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...
     )
{ }

关于c# - DBNull 从 DataSet Cast 到 Nullable 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36769621/

相关文章:

.net - 在 .net4 中使用具有 dbnull 值的 datareader

sql - 在PowerShell中处理System.DBNull

c# - 如何在MySql中以Nvarchar类型(过程参数)传递DBNull

c# - 在 C# 中即发即弃

c# - 在 Unity 中更改按钮的文本

c# - 如何使用 javascript 定位动态生成的文本框

vb.net - VB.NET 相当于 C# 的默认关键字是什么?

c# - 如何将空值传递给 SqlCommand 的参数

c# - WCF 服务、Windows 身份验证

c# - Lambda 表达式创建不相关的编译错误