2012-11-30 3 views
8

Quando aggiungo il parametro SQL p alla raccolta, ottengo un InvalidCastException con il messaggio dal titolo del post.SqlParameterCollection accetta solo oggetti di tipo SqlParameter non null, non oggetti DBNull

parentId è un numero annullabile e un numero intero non valido nel database.

Perché ottengo questa eccezione e come posso risolverlo?

Non utilizzo le stored procedure e ho letto i thread simili ma non mi hanno aiutato.

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

-2? pfffhhhhh ... – Elisabeth

+0

Non sono sicuro del motivo per cui questo è stato downvoted. È una domanda ben scritta con codice che riproduce il problema. – vcsjones

+0

@Thanks vcsjones per aiutarmi :) – Elisabeth

risposta

14

Non si aggiunge il numero new SqlParameter. p è il risultato di new SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) DBNull.Value. In altre parole, lo stesso p è DBNull.Value.

Spalato l'affermazione in due, in questo modo:

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

In alternativa,

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

O sarebbe assicurarsi p è il parametro, non è il valore del parametro.

+0

Oppure potresti usare solo parentesi: 'var p = new SqlParameter (" ParentId ", SqlDbType.Int) .Value = (parentId ?? (oggetto) DBNull)' – phoog

+0

@phoog Questo sarebbe significa la stessa cosa (beh, se si aggiunge il '.Value' dopo' DBNull'), quindi ancora non funzionerebbe. – hvd

+0

Oh si, capisco. Deve essere venerdì pomeriggio. – phoog

-2

è necessario utilizzare:

System.Data.SqlTypes.SqlInt32.Null