2016-11-03 2 views
0

다음 코드 :와 "객체가 다른 종류의 DBNull이에서 캐스팅 할 수는 없지만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() 
    }; 

... 좋은 한 번 실패 예외 출처 :. mscorlib에 예외 스택 트레이스 : System.DBNull에서. System.Convert.ToInt32에서 System.IConvertible.ToInt32 (IFormatProvider를 공급자) (개체 값) "

그래서 수량 또는 QtyShipped 중 하나가 DBNull이 (문자열의 바다 가운데 유일한 INT 애송이들이다가) 때로는 것 같다.

"DBNull이면 0을 var에 할당"하고 예외를 피할 방법이 있습니까? 당신이 그것을 많이 할 필요가 있다면 당신은 더 나은 가독성을 위해 코드를 축소 할 것이이 작업을위한 도우미 메서드를 만드는

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

:

답변

1

당신은 조건식을 사용할 수 있습니다.

+0

잠깐 당신의 유용한 편집을보고, 다음은 분명히 스타가 아닌 거리고, 말소되었다 ... 다음 TyCobb에 의해 복직. 편집 신체 상해가 발생합니다! –

+0

@ B.ClayShannon 그는 컴파일 오류를 수정했기 때문에 편집을 승인 한 것입니다. 고맙습니다! – dasblinkenlight

1

당신은뿐만 아니라이 표현을 사용할 수 있습니다

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

또 다른 아이디어와 마찬가지로, 'Field '을 얻으려고 시도하는'DataRow'를위한'FieldOrDefault '확장 메소드를 만들 수 있습니다. 실패한 경우'default (T)'를 반환하십시오. –

관련 문제