2013-09-27 3 views
0

모두 좋은 소식입니다.LINQ 쿼리의 지정된 캐스트 예외

글쎄, 나는 이상한 '지정 캐스트가 유효하지 않습니다.' 예외는 내 LINQ 쿼리 중 하나입니다. 다음과 같이

코드는 다음과 같습니다 여기

public string GetFiscalYearID(string fiscalYear) 
{ 
    int fYear = Convert.ToInt32(fiscalYear); 
    DataTable dtFiscalYearID = new DataTable(); 
    dtFiscalYearID = DomainBL.GetDomainDataFromFieldName("FiscalYearId"); 
    **var item = from r in dtFiscalYearID.AsEnumerable() 
       where r.Field<Int32>("FiscalYearNumber") == fYear 
       select r.Field<Int32>("FiscalYearId");**//Exception at this line 
    if (item.ToList().Count> 0) 
    { 
     return item.ToList()[0].ToString(); 
    } 
    else 
    { 
     return string.Empty; 
    } 
} 

, dtFiscalYearID 즉 단 2 열이있는 DB, FiscalYearIdFiscalYearNumber에서 DataTable을 가져옵니다. FiscalYearId 및 FiscalYearNumber의 DataTypes는 각각 tinyint 및 smallint입니다.

항목이 확장되면 지정된 캐스트 예외가 표시되며 Int16도 시도했지만 예외가 발생합니다.

여기의 전문가가 위의 코드에서 잘못된 점을 알 수 있습니까? 모든 포인터 또는 그와 같은 것이 꽤 감사 할 것입니다.

안부 아 누락 ​​

+0

null 값이 반환되는지 확인하십시오. –

+0

'r [ "FiscalYearNumber"]'와'r [ "FiscalYearId"]'를 대신 사용하십시오. –

+0

'dtFiscalYearID.Rows [0] [ "FiscalYearId"]. GetType()'을 사용하여 필드의 유형을 확인할 수 있다고 생각합니다. – Kaf

답변

3

이 시도 :

tinyint는 C#에서 바이트, 바이트 int 직접

EDIT로 주조 될 수있다

select (int) r.Field<byte>("FiscalYearId") 

이 목록에 따르면

: MSDN mapping CLR parameter list , tinyint는 Byte에 매핑됩니다. 나는 또한 당신이 smallint을 int32로 변환하려고 시도하고 있기 때문에 그 라인이 손상되었다고 생각한다.

where r.Field<Int16>("FiscalYearNumber") == fYear 

Int16smallint는 동일하다.

+0

물론, 바로 시도 할 것입니다 ... – Anurag

+0

Mr Wudzik, 위의 해결책 실제로는 작동하지 않지만 솔루션 변종을 시도했지만 헛되이 지정된 캐스트 예외가 발생합니다. 다른 생각? – Anurag

+0

@Anurag 체크 수정 – wudzik