문제는 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으로 실패 할 것이며 이는 모든 제품을 무료로 제공하는 것보다 낫습니다.