2012-09-25 33 views
1
EnumType = reader["EnumTypeId"] == DBNull.Value ? EnumType.None : (EnumType)(int)reader["EnumTypeId"]; 

我想如果reader["EnumTypeId"]爲空,它應該指定EnumType.None值,但它仍然試圖將空值轉換爲明顯導致異常的int值。爲什麼DBNull.Value在這裏不起作用?

我嘗試以下,並沒有工作,要麼:不要使用Enums

EnumType = reader["EnumTypeId"] == null ? EnumType.None : (EnumType)(int)reader["EnumTypeId"]; 

,我徑自決定用一個可空int,所以現在我的代碼略有不同,但它仍然不DBNull.Valuenull,或GetOrdinal...

intType= reader["intType"] == DBNull.Value ? null : (int?)reader["intType"]; 

也行,爲什麼我必須做投,而不是僅僅一個一個演員?

+1

嘗試這一個'讀者[ 「EnumTypeId」] == null' – Sender

回答

2

不要使用DBNull,只需使用普通的舊版本null

EnumType = reader["EnumTypeId"] == null ? EnumType.None : (EnumType)(int)reader["EnumTypeId"]; 

編輯

問題可能是的EnumTypeId的數據庫類型不是int /的Int32。如果是這樣,那麼讀取字符串,然後解析應該解決問題。

EnumType? enumVal = null; 
if (reader["EnumTypeId"] != null) 
{ 
    int intVal; 
    enumVal = (int.TryParse(reader["EnumTypeId"].ToString(), out intVal)) ? (EnumType)intVal : null; 
} 
EnumType = ? EnumType.None : (EnumType)(int)reader["EnumTypeId"]; 
+0

是什麼的DBNull和空之間的區別? – Xaisoft

+1

請參閱:http://stackoverflow.com/questions/4958379/what-is-the-difference-between-null-and-system-dbnull-value –

+0

我看不到在文檔中的直接答案(http:///msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx),但我記得使用'null'「工作」。也許庫勒的答案更正確,我真的不知道。 – McGarnagle

1

你可以用另一種方式是IsDBNull方法:

int index = reader.GetOrdinal("EnumTypeId"); 
EnumType = reader.IsDBNull(index) ? EnumType.None : 
            (EnumType)reader.GetInt32(index); 
+0

是否有可能繞過GetOrdinal並將上面的語句變爲一條語句? – Xaisoft

+0

@ Xaisoft:有了GetOrdinal,你可以使用IsDBNull和GetInt32,我發現這個更清晰 –

+0

試過這個,它沒有工作。我更新了我的代碼,因此我會更新我的帖子 – Xaisoft

相關問題