2012-11-30 11 views
8

Wenn ich den SQL-Parameter zur Sammlung hinzufüge, erhalte ich eine InvalidCastException mit der Nachricht aus dem Beitragstitel.SqlParameterCollection akzeptiert nur Nicht-Null-Objekte vom Typ SqlParameter, keine DBNull-Objekte

parentId ist eine nullbare Ganzzahl und eine nullwertfähige Ganzzahl in der Datenbank.

Warum bekomme ich diese Ausnahme und wie kann ich sie lösen?

Ich verwende keine gespeicherten Prozeduren und ich habe die ähnlichen Threads gelesen, aber sie haben mir nicht geholfen.

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

-2? pfffhhhhh ... – Elisabeth

+0

Nicht sicher, warum dies nach unten geht. Es ist eine gut geschriebene Frage mit Code, der das Problem reproduziert. – vcsjones

+0

@Thanks vcsjones für die Hilfe :) – Elisabeth

Antwort

14

Sie fügen nicht Ihre new SqlParameter. ist das Ergebnis von new SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) DBNull.Value. Mit anderen Worten, selbst ist DBNull.Value.

Split die Aussage in zwei, etwa so:

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

Alternativ

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

Entweder würde sicherstellen, p ist der Parameter nicht den Wert des Parameters.

+0

Oder Sie könnten einfach Klammern verwenden: 'var p = neue SqlParameter (" ParentId ", SqlDbType.Int) .Wert = (parentId ?? (Objekt) DBNull)' – phoog

+0

@phoog Das wäre Das gleiche bedeuten (naja, wenn Sie den '.Value' nach' DBNull' hinzufügen), würde also immer noch nicht funktionieren. – hvd

+0

Oh ja, ich verstehe. Es muss Freitagnachmittag sein. – phoog

-2

Sie müssen verwenden:

System.Data.SqlTypes.SqlInt32.Null 
Verwandte Themen