2016-11-03 20 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 Исключение StackTrace: в System.DBNull. System.IConvertible.ToInt32 (поставщик IFormatProvider) в System.Convert.ToInt32 (значение объекта) "

Таким образом, кажется, что либо Кол-во или QtyShipped иногда DBNull (только ИНТ Vals среди моря струн).

Есть ли способ сказать «если это DBNull, назначить 0 для var» и тем самым избежать исключения?

ответ

1

Вы можете использовать условное выражение:

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

Если вам нужно сделать, это много, делая вспомогательный метод для выполнения этой задачи позволит вам сжать ваш код для лучшей читаемости.

+0

Я видел ваш полезный редактировать на секунду, а потом, видимо, стерт Риго, который не звезда ... а затем восстановлен TyCobb. Исправляется редактирование! –

+0

@ B.ClayShannon он исправил ошибку компиляции, поэтому, я одобрил его редактирование. Спасибо! – dasblinkenlight

1

Вы можете использовать это выражение, а также:

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

Также как еще одна идея, вы можете создать 'extensionOpDefault ' метод расширения для 'DataRow', который пытается получить' Поле ', и если это не удается, верните 'default (T)'. –

 Смежные вопросы

  • Нет связанных вопросов^_^