可以使用?? (合并运算符)与DBNull?

时间:2012-02-24 19:29:38

标签: c# .net null-coalescing-operator

如果我的代码类似于以下内容:

while(myDataReader.Read())
{
  myObject.intVal = Convert.ToInt32(myDataReader["mycolumn"] ?? 0);
}

它抛出错误:

  

无法将对象从DBNull强制转换为其他类型。

intVal定义为可以为空的int不是一个选项。有没有办法让我做到以上几点?

6 个答案:

答案 0 :(得分:14)

这里还有一个选择:

while (myDataReader.Read())
{
    myObject.intVal = (myDataReader["mycolumn"] as int? ?? 0);
}

答案 1 :(得分:13)

您可以使用扩展方法吗? (写在我的头顶)

public static class DataReaderExtensions 
{
    public static T Read<T>(this SqlDataReader reader, string column, T defaultValue = default(T))
    {
        var value = reader[column];

        return (T)((DBNull.Value.Equals(value))
                   ? defaultValue
                   : Convert.ChangeType(value, typeof(T)));
    }
}

您可以使用它:

while(myDataReader.Read())
{
  int i = myDataReader.Read<int>("mycolumn", 0);
}

答案 2 :(得分:6)

您可以简单地使用Int32.Tryparse吗?

int number;
bool result = Int32.TryParse(myDataReader["mycolumn"].ToString(), out number);

根据MSDN,如果转换失败,number将包含0

答案 3 :(得分:5)

如下:

object x = DBNull.Value;
int y = (x as Int32?).GetValueOrDefault(); //This will be 0

或者在你的情况下:

int i = (myDataReader["mycolumn"] as Int32?).GetValueOrDefault();

答案 4 :(得分:2)

为什么不使用空合并运算符以外的其他内容(DBNull.Value!= null):

int i = myDataReader["mycolumn"] == DBNull.Value ?
            Convert.ToInt32(myDataReader["mycolumn"]) :
            0;

你总是可以用一个简洁的扩展方法把它包起来:

public static T Read<T>(this DataReader reader, string column, T defaultVal)
{
    if(reader[column] == DBNull.Value) return defaultVal;
    return Convert.ChangeType(reader[column], typeof(T));
}

答案 5 :(得分:1)

不,只适用于空值。

对象的扩展方法如何检查DBNull,并返回默认值?

//may not compile or be syntactically correct! Just the general idea.
public static object DefaultIfDBNull( this object TheObject, object DefaultValue )
{
    if( TheObject is DBNull )
        return DefaultValue;
    return TheObject;
}