2012-11-30 12 views
8

Po dodaniu parametru SQL p do kolekcji otrzymuję komunikat InvalidCastException z wiadomością z tytułu wpisu.SqlParameterCollection akceptuje tylko nie puste obiekty typu SqlParameter, a nie obiekty DBNull

parentId to liczba całkowita z wartością zerową i zerowalna liczba całkowita w bazie danych.

Dlaczego otrzymuję ten wyjątek i jak mogę go rozwiązać?

Nie używam procedur przechowywanych i czytałem podobne wątki, ale mi nie pomogły.

var p = new SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) DBNull.Value; 
cmd.Parameters.Add(p); 
+0

-2? pfffhhhhh ... – Elisabeth

+0

Nie wiem, dlaczego jest to obniżane. To dobrze napisane pytanie z kodem, które odtwarza problem. – vcsjones

+0

@Thanks vcsjones za pomoc :) – Elisabeth

Odpowiedz

14

Nie dodajesz swojej new SqlParameter. p jest wynikiem new SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) DBNull.Value. Innymi słowy, sama p to DBNull.Value.

Podział oświadczenie w dwóch, jak w przykładzie:

var p = new SqlParameter("ParentId", SqlDbType.Int); 
p.Value = parentId ?? (object) DBNull.Value; 
cmd.Parameters.Add(p); 

Alternatywnie

var p = new SqlParameter("ParentId", SqlDbType.Int) { Value = parentId ?? (object) DBNull.Value }; 
cmd.Parameters.Add(p); 

Albo by upewnić p jest parametr, a nie wartość parametru.

+0

Albo możesz po prostu użyć nawiasów: 'var p = new SqlParameter (" ParentId ", SqlDbType.Int) .Value = (parentId ?? (object) DBNull)' – phoog

+0

@phoog To by oznacza to samo (cóż, jeśli dodasz '.Value' po' DBNull'), to i tak nie zadziała. – hvd

+0

O tak, widzę. To musi być piątkowe popołudnie. – phoog

-2

Trzeba użyć:

System.Data.SqlTypes.SqlInt32.Null 
Powiązane problemy