2016-11-03 56 views
0

下面的代碼:如何搶佔試圖將DBNull分配給int?

foreach (DataRow fillRateDataRow in dtFillRateResults.Rows) 
{ 
    . . . 
    var frbdbc = new FillRateByDistributorByCustomer 
    { 
     ShortName = fillRateDataRow["ShortName"].ToString(), 
     Unit = fillRateDataRow["Unit"].ToString(), 
     CustNumber = fillRateDataRow["Custno"].ToString(), 
     MemberItemCode = fillRateDataRow["MemberItemCode"].ToString(), 
     Qty = Convert.ToInt32(fillRateDataRow["Qty"]), 
     QtyShipped = Convert.ToInt32(fillRateDataRow["QtyShipped"]), 
     ShipVariance = fillRateDataRow["ShipVariance"].ToString(), 
     CWeek = fillRateDataRow["CWeek"].ToString(), 
     PAItemCode = fillRateDataRow["PAItemCode"].ToString(), 
     PADescription = fillRateDataRow["PADescription"].ToString(), 
     TransactionType = fillRateDataRow["TransactionType"].ToString(), 
     SplitCase = fillRateDataRow["SplitCase"].ToString(), 
     ReasonCode = fillRateDataRow["ReasonCode"].ToString(), 
     ReasonDescription = fillRateDataRow["ReasonDescription"].ToString(), 
     CompanyName = fillRateDataRow["CompanyName"].ToString() 
    }; 

...在一個偉大的失敗一次,而用「對象不能從DBNull轉換到其他類型的 例外來源:mscorlib程序 異常堆棧跟蹤:在System.DBNull。 System.IConvertible.ToInt32(的IFormatProvider提供商) 在System.Convert.ToInt32(對象的值)

如此看來,無論是數量還是QtyShipped有時爲DBNull(字符串之中的海洋中唯一INT瓦爾斯)。

有沒有辦法說「如果它是DBNull,將0賦值給var」並從而避免異常?

回答

1

您可以使用條件表達式:

QtyShipped = fillRateDataRow["QtyShipped"] != DBNull.Value ? Convert.ToInt32(fillRateDataRow["QtyShipped"]) : 0 

如果你需要做大量的,製作一個輔助方法完成這個任務將讓你縮小你的代碼更易讀。

+0

我看到了你的有用編輯用於第二,然後它顯然是由RIGO,誰不是一星磨滅......然後TyCobb恢復。編輯混亂正在進行中! –

+0

@ B.ClayShannon他確實修復了一個編譯錯誤,但是,這就是爲什麼我批准他的編輯。謝謝! – dasblinkenlight

1

您可以使用此表達以及:

QtyShipped = fillRateDataRow.Field<int?>("QtyShipped") ?? 0; 
+0

同樣也是另一種想法,你可以爲'DataRow'創建一個'FieldOrDefault '擴展方法,它試圖獲得'Field ',如果失敗,則返回'default(T)'。 –