2012-01-10 11 views
11

dla tego zapytania LINQ Dostaję poniższy wyjątek:InvalidCastException w kwerendzie LINQ

(from row in ds.Tables[0].AsEnumerable() 
where row.Field<string>("Dept_line_code") == DeptCode && 
row.Field<string>("Skill_Name") == skill && 
row.Field<string>("Acct_Code") == account && row.Field<string>("Location") == dtNewTable.Rows[intRow]["Location"].ToString() 
select row.Field<int>("Presently_Available") == null ? 0 : row.Field<int>("Presently_Available") 
).FirstOrDefault(); 

informacje Wyjątek:

typ Wyjątek: InvalidCastException

wiadomość

Wyjątek: Nie można rzucać DBNull .Opcja do wpisania "System.Int32". Użyj typu zerowego.

Nie znam typu zerowego i nie rozumiem, jak używać typu nullable do pokonania tego wyjątku.

+2

skrócie: domyślnie prymitywne typy (takie jak 'int',', 'double' pływaka ', ...) nie można przypisać wartości null. Rozwiązaniem tego problemu jest użycie typu nullable (np. 'Int?'), Który jest tak naprawdę tylko otoką wokół typu pierwotnego. – ean5533

+0

Wygląda na to, że używasz DataSet, prawdopodobnie wypełnionego przez DataAdapter. Następnie możesz wypełnić nie DataSet [ale DataTable] (http://msdn.microsoft.com/en-us/library/905keexk.aspx), jeśli masz pewność, że wynikowe zapytanie zawiera tylko jedną tabelę. – abatishchev

+0

Kiedy potrzebujemy użyć typów nullable? jakie scenariusze? dlaczego musimy używać tego samego? Potrzebujesz informacji o celu i zaletach lub wadach typów NUllable? – venkat

Odpowiedz

21

musisz wprowadzić int accept null value => int?

row.Field<int?>("Presently_Available") == null ? 0 : row.Field<int>("Presently_Available") ; 

a to link dla pustych typów

+2

Powinieneś podać link lub krótkie wyjaśnienie typów zerowych w swojej odpowiedzi. OP nie zrozumie, dlaczego 'int?' Rozwiązuje jego problem. – ean5533

+1

Po prostu to edytuję;) – Akrem

+0

Wow, kilka godzin poszukiwań, aby dowiedzieć się, po prostu potrzebowałem znaku zapytania! – mack

5

zmian row.Field<int> do row.Field<int?>

Powiązane problemy