如果我的代码类似于以下内容:
while(myDataReader.Read())
{
myObject.intVal = Convert.ToInt32(myDataReader["mycolumn"] ?? 0);
}
它抛出错误:
无法将对象从DBNull强制转换为其他类型。
将intVal
定义为可以为空的int不是一个选项。有没有办法让我做到以上几点?
答案 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;
}