2009-10-14 4 views
0

오류가 계속 발생합니다. System.InvalidCastException : 지정된 캐스트가 유효하지 않습니다. 런타임 중에. RewardJoinType은 db에서 null 일 수 있습니다. Int16에 Nullable 열거 형을 캐스팅합니다.

캐스트 실패 코드 라인 :

c.rewardJoinType = (RewardJoinType)reader.GetInt16(); 

'reader.GetInt16을()'형태의 예외 'System.InvalidCastException'짧은 System.InvalidCastException {}를 던진

클래스에서 나는 다음과 같은 코드의 라인있어 ... 다른 코드를

private RewardJoinType? rewardJoinType; 

c.rewardJoinType = (RewardJoinType?)reader.GetInt16(); 

... 다른 코드

conn.AddParam("@rewardJoinType", (int?)rewardJoinType); 

... 다른 코드 여기

public RewardJoinType? RewardJoinType 
{ 
    get { return rewardJoinType; } 
    set { rewardJoinType = value; } 
} 

그리고는

public enum RewardJoinType 
{ 
    Auto, 
    Manual 
} 

때문에하여인가 열거 자체입니다 기본 열거 형은 Int32 및 심지어 t입니다. 내가 nullable Int16을 캐스팅 할 수 없기 때문에 그것을 가지고있어?

우리는 아직 우리의 리더처럼 INT16에 대한 DBNull이 처리는 : 데이터베이스 값이 null의 경우

는 당신이 실제로 돌아갈 것은 '널 (null)'하지 DBNull이의 인스턴스입니다
public short GetInt16() 
    { 
     columnIndex++; 
     return reader.IsDBNull(columnIndex) ? (short)0 : reader.GetInt16(columnIndex); 
    } 
+0

어디에서 InvalidCastException이 throw 되는가? 어떤 코드 줄? 그리고 그것은 무엇을 던지려고 노력하고 있습니까? – thecoop

+0

업데이트 됨. 예외에서 유효하지 않은 캐스트 만 표시됩니다. 내면의 예외는 없습니다. 위 참조. – PositiveGuy

+0

아,이 필드는 DB의 TinyInt로 가져 왔습니다. – PositiveGuy

답변

5

및 DBNull이 수 없어 다른 것으로 변환 될 수 있습니다. 이러한 상황에 대해 GetXXX()의 반환 값을 null 또는 nullable 구조체로 변환하는 도우미 메서드를 작성합니다. 다음과 같이 입력하십시오 :

static T? ConvertIfNotDBNull<T>(object o, Converter<object, T> converter) where T : struct { 
     return o is DBNull ? (T?)null : converter(o); 
    } 

및 변환 자로 전달하십시오 .ToInt32 또는 변환기와 비슷합니다.

디버거가 연결된 상태에서 실행하면 예외를 던지고있는 곳을 정확하게 찾아서 서로주고 받기를 시도 할 때 도움이 될 수 있습니다. 이

obj val = reader.GetValue(); 
if(val != DbNull.Value) c.RewardJoinType = (RewardJoinType)val; 
+0

원본 게시물이 업데이트되었습니다. 이미 처리 한 내용을 확인하십시오. – PositiveGuy

0

데이터베이스 널 (null) 코드 널 (null)이 아니다. DB 필드가 tinyInt 유형이므로 바이트를 반환하도록 GetInt8()이 필요했습니다.

+0

업데이트 된 게시물보기. 우리는 커스텀 GetInt16() 메소드로 이미 0을 리턴함으로써 DBNull을 처리합니다. – PositiveGuy

1

좋아, 내 실수와 같은 뭔가가 필요하므로

+0

@coffeeaddict : 그러면 문제가 해결 되었습니까? – Nils

관련 문제