2011-12-07 2 views
2

"System.InvalidCastException : 지정된 캐스트가 유효하지 않습니다."데이터 세트에 Linq을 사용하여 다음 예외가 발생합니다.Linq To 데이터 설정 오류 System.InvalidCastException : 지정된 캐스트가 유효하지 않습니다.

문제는 다음과 같습니다. int 유형의 두 값을 가진 모델이 있습니다. 일부 값이 공백이되도록 데이터베이스의 값은 필요하지 않습니다. 테이블을 데이터 세트로 읽었으므로 이제 다음 코드를 사용하여 데이터 세트를 쿼리해야합니다.

//model 
public class Model 
{ 
    // Public Properties 
    ... 
    ... 
    ... 
    public int? YearBegin { get; set; } 
    public int? YearEnd { get; set; } 
} 

//query 
var list = from m in data.Tables["Models"].AsEnumerable() 
select new Model 
{ 
    // rest of members omitted to simplify 
    YearBegin = m.Field<int>("YearBegin"), 
    YearEnd = m.Field<int>("YearEnd") 
}; 

나는 다음으로도 문제가 해결되지 않은 시도 :

m.Field<int?>("YearBegin") 
YearEnd = m.IsNull("YearEnd") ? null, m.Field<int>("YearEnd") 

필드가 String.IsNullOrEmpty 유사한 값을()이 있는지 확인하는 또 다른 방법이있다. 유형이 가능성 아니므로 문자열을 사용 ...

감사

+0

... 기존 액세스 데이터베이스에 대해 일하고 데이터 형식 대신 긴 정수가 잘못된 캐스트 예외 따라서 데이터 세트에서 INT16로 표현되는 의미에 정수로 저장되었다 무엇 'YearBegin = m.Field ("YearBegin")'을 (를) 시도했을 때 발생 했습니까? 같은 오류가 발생 했습니까? – Rondel

+0

예, 동일한 오류입니다. m.IsNull ("YearEnd")는 항상 true를 반환하는 것으로 보입니다. – user655261

+0

모델에 필드가 int로있을 수 있지만 데이터베이스의 기본 컬럼 유형은 무엇입니까? 호환되지 않는 유형 (예 : 오라클이 Number 열을 10 진수로 반환하는 것을 좋아 함)을 변환하려고했기 때문에 잘못된 캐스트가 발생했을 수 있습니다. 열이 Date/DateTime 일 수도 있는데이 경우에는 DateTime으로 형변환하고 Year 속성을 추출해야합니다. – Joshua

답변

1

당신은, 그래서 내 첫 번째 질문이 될 것이다 형식화 된 데이터 집합을 사용하지 않는 인 DataTable에 그 필드가 있어야하는 것을 알고 않습니다 'int?' 처음에는 문자열로 나열되어 있습니까? DataTable에서 해당 필드를 문자열로 처리하면 해당 오류가 발생합니다.

using (TestData ds = new TestData()) 
{ 
     // Typed Rows 
     ds.Models.AddModelsRow("1", "2"); 
     ds.Models.AddModelsRow(ds.Models.NewModelsRow()); // NULL INFO TEST 
     // Untyped rows 
     DataRow r = ds.Models.NewRow(); 
     r[0] = "4"; 
     r[1] = "5"; 
     ds.Models.Rows.Add(r); 


     //query 
     var list = from m in ds.Tables["Models"].AsEnumerable() 
       select new Model 
       { 
        // rest of members omitted to simplify 
        YearBegin = m.Field<int?>("YearBegin"), 
        YearEnd = m.Field<int?>("YearEnd"), 
       }; 
} 

InvalidCastException은 발생합니다 그 코드 : 다음 코드는이 널 (NULL) 문자열 YearBegin로 열 및 연말과 더불어, 모델 DataRow를 가진 TestData 사용 데이터 집합을 가정합니다. 나는이 널 INT32에 DataTable을에 유형을 뒤집어 때, 다음, 거의 동일한 코드가 제대로 작동합니다

using (TestData ds = new TestData()) 
{ 
     // Typed Rows 
     ds.Models.AddModelsRow(1, 2); 
     ds.Models.AddModelsRow(ds.Models.NewModelsRow()); // NULL INFO TEST 
     // Untyped rows 
     DataRow r = ds.Models.NewRow(); 
     r[0] = 4; 
     r[1] = 5; 
     ds.Models.Rows.Add(r); 


     //query 
     var list = from m in ds.Tables["Models"].AsEnumerable() 
       select new Model 
       { 
        // rest of members omitted to simplify 
        YearBegin = m.Field<int?>("YearBegin"), 
        YearEnd = m.Field<int?>("YearEnd"), 
       }; 
} 

당신의 DataTable을 살펴보십시오. 문제를 해결할 수 있습니다. 필드 캐스팅 int로? DataTable 필드가 int와 일치하지 않으면 작동하지 않습니다? 유형.

관련 문제