2

음이 DBNull.value, 을 처리 할 수있는 방법 중 하나입니다하지만 이것은collasce null 연산자를 DbNull.Value와 함께 사용하는 방법? , 그들 중 누구도 작품

decimal UnitPrice = row["UnitPrice"] == DBNull.Value ? 0.00m : (decimal)row["UnitPrice"]; 

그럼 나는이 시도했다 작동 DBNull.value

을 처리하기 위해 널 병합 연산자를 사용하여 구문을 원한다 ,

decimal UnitPrice = (decimal)row["UnitPrice"] ?? 0.00m 
UnitPrice = Convert.ToDecimal(row["UnitPrice"]) ?? 0.00m 
UnitPrice = Decimal.Parse(row["UnitPrice"].ToString()) ?? 0.00m 

나는이

무엇입니까 (210)

내가 잘못된 질문을하거나 문제는 너무가 보자 빛 :

답변

0

decimal는 값 형식이고 null 될 수 없습니다 바랍니다 경우에도 내 지식 유효하지 않을 수 있습니다. 당신은 당신은 첫 번째 방법을 계속 사용할 수 있습니다 만 reference types.?? 연산자를 사용하거나 뭔가 같이 할 수 있습니다 :

decimal UnitPrice = (object)row["UnitPrice"] ?? default(decimal) 
2

문제는 DBNull.Value가 null이 아닌 것입니다. DBNull.Value를 0.0m으로 바꾸고 싶지만 더 좋은 솔루션은 nullable 형식을 사용하는 것입니다. 즉, decimal 대신 decimal?을 사용하십시오.

decimal unitPrice = (row["UnitPrice"] as decimal?) ?? 0.0m 

또는

decimal unitPrice = (row["UnitPrice"] as decimal?).GetValueOrDefault(); 

도우미 함수가 그것을 만들 것입니다 : 당신이 할 수없는 경우

decimal? unitPrice = row["UnitPrice"] as decimal?; 

, 당신은 대신이 작업을 수행 할 수 있습니다 그럼 당신은 as 연산자를 사용할 수 있습니다 이 작업을 많이 수행하면 약간 덜 장황하게됩니다.

T FromObject<T>(object o) where T : struct { return (o as T?).GetValueOrDefault(); } 

다음 0이 아닌 디폴트 값이 필요한 경우

decimal unitPrice = FromObject<decimal>(row["UnitPrice"]); 

: 다음

decimal unitPrice = FromObject<decimal>(row["UnitPrice"], Decimal.MinValue); 

이 방법의 단점은

T FromObject<T>(object o, T defaultValue) where T : struct 
{ 
    return (o as T?).GetValueOrDefault(defaultValue); 
} 

을 당신은의 기본 유형을 변경하는 경우 데이터베이스 열에서 예외 대신 허위 0을 다시 시작합니다. 객체가 예를 들어 1.2f 인 경우 o as decimal?은 null을 반환하므로 0.0m으로 대체되기 때문입니다. 그러나 o == DBNull.Value ? 0.0m : (decimal)o이라는 표현식은 (decimal)(object)1.2f과 같을 것이고, 이는 InvalidCastException으로 실패 할 것이며 이는 모든 제품을 무료로 제공하는 것보다 낫습니다.