2014-02-06 5 views
0

DataTable 테이블이 있습니다. 그 테이블에서 나는 typeof (십진수) 인 컬럼으로부터 값을 읽는다. 이 값을 십진수로 변환하려고합니까? dec. value가 null이면 예외가 발생합니다. 나는이 방법을 시도 : SqlDataReader 개체를 사용하여 SQL 데이터 테이블에서 읽을 때 DataTable에서 nullable 십진수를 캐스팅합니다.

decimal? dec= row["myRow"] == null ? null : (decimal?)row["myRow"]; 
//this thorws "Specified cast is not valid." Exception 

decimal? dec= myRdr["myValue"] == DBNull.Value ? null : (decimal?)myRdr["myValue"]; 
//this does NOT throw an Exception?? 

내가 두 번째 해결책을 시도하고 그것은 아무런 문제없이 일했다.

+1

두 번째 방법은 올바른 방법입니다. DbNull과 null은 동일하지 않습니다. – dbugger

+0

@dbugger : 첫 번째 것은 DataTable에서 읽고 두 번째 것은 SQL 데이터베이스 테이블에서 읽는 것입니다. DataTable의 null 값도 DBNull입니까? – user1080533

+0

예, 그렇게 될 것입니다. 또 다른 구문은'if (myRdr [ "myValue"]가 DBNull 인 경우) ...'입니다. – DonBoitnott

답변

2

의견에서 말했듯이, DBNull.Valuenull은 같은 것이 아닙니다. 당신이 작성하는 그래서 때

decimal? dec= row["myRow"] == null ? null : (decimal?)row["myRow"]; 

을 당신은이 일을하려고합니다 그래서 (다른 사람의) 두 번째 부분

(decimal?)row["myRow"]; 

실행 거짓

if(DBNull.Value == null) 
{ 
    return null; 
} 
else 
{ 
    return (decimal?)row["myRow"]; 
} 

합니다. 이 예외가 throw됩니다.

그러나 두 번째 경우에

: 캐스트 문이 실행되지 않고 널 (null)이 반환되도록

if(DBNull.Value == DBNull.Value) 
{ 
    return null; 
} 
else 
{ 
    return (decimal?)row["myRow"]; 
} 

는 사실이다.

관련 문제