2011-05-19 42 views
5

我想用数据库表中的值填充一个类对象。 someObject.Property字段是一个可为空的int类型。投射一个NULL值

someObject.Property = Convert.ToInt32(dbReader["SomeField"]); 

所以,如果SomeFieldnullConvert会给出一个DBNull错误。有没有一个特定的方法,我应该用这个?

回答

5

这应该工作...

someObject.Property = dbReader["SomeField"].Equals(DBNull.Value) 
    ? null 
    : (Int32)dbReader["SomeField"]; 

@John - 良好的渔获物。编辑以反映该疏忽。

+1

-1:DBNull是一个类型,而不是一个值。你需要比较'DBNull.Value'。而且你最好使用'IsDbNull'。 – 2011-05-19 17:15:49

2

我用这个,用任何默认值代替0。如果该属性为nullable那么您将默认为C#null

someObject.Property = (DBNull.Value.Equals(dbReader["SomeField"])) ? 0 : Convert.ToInt32(dbReader["SomeField"]); 
+0

他的财产是'的Int32?'所以大概'null'是首选。否则相同的想法。 =) – Yuck 2011-05-19 16:58:38

+0

哎呀,在你的文章中错过了。他没有声明“someObject.Property字段是一个可为空的int类型。” – Yuck 2011-05-19 17:01:21

0

您可以使用此:

if (reader["SomeField"] != DBNull.Value) 
    someObject.Property = reader.GetInt32(dbReader("SomeField")); 
1

你可以使用TryParse。这不会专门检查NULL,但它会告诉你它是否可解析,这可能是你真正想要的。

bool result = Int32.TryParse(value, out number); 
+0

对不起,编辑您的答案认为这是我的。恢复它。 – manojlds 2011-05-19 17:00:52

0
int someFieldIndex = reader.GetOrdinal("SomeField"); 
someObject.Property = reader.IsDbNull(someFieldIndex) ? null : (Int32?)reader.GetInt32(someFieldIndex); 
3

这种方法可能是你想要做什么有用的。它会尝试将列值解析为相应的类型,如果不能,则返回类型默认值。

public T ParseValue<T>(System.Data.SqlClient.SqlDataReader reader, string column) 
{ 
    T result = default(T); 
    int index = reader.GetOrdinal(column); 
    if (!reader.IsDBNull(index)) 
     result = (T)reader.GetValue(index); 

    return result; 
} 
0
someObject.Property = Convert.ToInt32(dbReader["SomeField"].ToString());