2016-11-03 61 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)'。 –