2011-08-17 103 views
12

在我的程序中,我循環訪問數據表以獲取每個字段的數據。我的一行代碼如下所示:在轉換爲int之前將空字段轉換爲零?

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]); 

基本上,我只是把那單元格中的值,並將其轉換爲Int32。但是,當字段中的數據爲空時,我遇到了一個問題。我收到無法將「DBNull」轉換爲另一種類型的錯誤消息。

所以,我知道我可以只檢查該字段的值之前,我嘗試做這樣的事情,將其轉化:

if (resultsDT.Rows[currentRow]["LYSMKWh"] == null) 
      { 
       resultsDT.Rows[currentRow]["LYSMKWh"] = 0; 
      } 

但是,有沒有更好的方法來做到這一點?有沒有什麼我可以做「內聯」,而我試圖轉換的價值,而不必訴諸於使用if

編輯:我曾嘗試使用此建議的方法:

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? "0"); 

不幸的是,我還收到了無效的轉換錯誤信息與問候到的DBNull類型。有人建議我可以使用問題?如果任何一方的類型不同,則爲運算符。另外,由於我完全控制了構建數據表的數據,因此我將其更改爲不會將空值寫入任何字段。所以,在這種情況下,幾乎否定了將null轉換爲int32的需要。感謝所有的建議,每個人!

回答

9

你能做到這一點

var LYSMKwhField = resultsDT.Rows[currentRow]["LYSMKWh"]; 
int LYSMKWh = LYSMKwhField != DBNull.Value ? Convert.ToInt32(rowData) : 0; 
+0

這對我來說確實很好。我嘗試使用下面的例子與??運算符,但我仍然收到了無效投射錯誤消息。從下面用戶CodeNaked說的,使用??時可能會出現問題?如果兩邊的類型不同。 – Kevin

3

您可以考慮使用C#的??運算符,該運算符會檢查null值,如果爲null,則爲其分配默認值。如果它是DBNull.Value,而不是null

var LYSMKWh = 
    resultsDT.Rows[currentRow]["LYSMKWh"].Equals(DBNull.Value) 
    ? 0 
    : Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]); 
+4

一個例子是'INT LYSMKWh = Convert.ToInt32(resultsDT.Rows [currentRow] [ 「LYSMKWh」]ϵ 0);' –

+0

掉進同樣的陷阱 - 只有當resultsDt.Rows [...] [[]]類型是int(或任何自動從0轉換的數字) - 但是然後Convert.ToInt32將是無意義的 - 我想這是一個字符串? – Carsten

+1

你是對的..如果OP擁有數據庫的控制權,也許他可以將其設置爲返回null,並完全刪除代碼的第一部分(一個需要並轉換爲int)。它應該會順利...... –

0

檢查:

if (resultsDT.Rows[currentRow]["LYSMKWh"] == DBNull.Value) 
{ 
    resultsDT.Rows[currentRow]["LYSMKWh"] = 0; 
} 

三元表達會的工作是這樣的:

5

使用?運營商:

resultsDT.Rows[currentRow][...] ?? "0" 

(預計領域是一個字符串 - 如果不改變「0」)

0

可以使用?運營商:

object x = null; 

int i = (int)(x ?? 0) 
1

您可以用三元操作符替換:

var rowData = resultsDT.Rows[currentRow]["LYSMKWh"]; 
int LYSMKWh = rowData != null ? Convert.ToInt32(rowData) : 0; 

另外,在??運營商可以工作:

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? 0); 

但我認爲這是不太可讀。

+0

我不知道,我有點像你的第二個例子。我從來沒有用過?操作員,所以我有興趣檢查一下。 – Kevin

+0

我的第二個例子也會進行從0到'int'的不必要的轉換,這可能會或可能不會導致一些性能問題。我不確定你期望從resultsDT得到什麼類型,所以如果你期望一個字符串等,你可能不得不放置一個「0」而不是0,等等。 –

2

您可以使用自定義的轉換方法:

public static int ConvertToInt32(object value, int defaultValue) { 
    if (value == null) 
     return defaultValue; 
    return Convert.ToInt32(value); 
} 

則可能需要採取其他類型,如字符串重載。如果兩側的類型不同,您可能會遇到??運營商的問題。

+0

我喜歡這個答案。你是對的,我遇到了一個問題,使用??操作員(我收到了與我的OP相同的錯誤消息)。 – Kevin

0

您可以使用擴展方法。

int LYSMKWh = resultsDT.Rows[currentRow]["LYSMKWh"].IfNullThenZero(); 

創建以下類

public static class Converter 
{ 
    public static Int32 IfNullThenZero(this object value) 
    { 
     if (value == DBNull.Value) 
     { 
      return 0; 
     } 
     else 
     { 
      return Convert.ToInt32(value); 
     } 
    } 
}