Warum kann ich nicht "" verwenden? " Operand für System.dbnull Wert?
Frage
Ich habe eine Oracle-Datentabelle, die Spalten abruft, die null sind.Um den Code schön und einfach zu halten, denke ich, dass ich das ?? verwenden würde.Operand.AlternatePhoneNumber ist eine Zeichenfolge in meinem C#-Modell.
AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""
Aber selbst mit diesem Code erhalte ich immer noch den Fehler.
System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
Ich weiß, was der Fehler bedeutet, aber warum??nicht auf DBNull verwendbar?Sind null und DBNull nicht im Wesentlichen dasselbe?
Danke schön.
Lösung
Der ??
Der Operator gilt nur für tatsächliche null
S.
null
Und DBNull.Value
sind nicht das Gleiche; DBNull.Value
ist einfach ein Platzhalterobjekt.
Außerdem kommt diese Ausnahme aus dem Inneren AlternatePhoneNumber
Eigentum, vor Ihrem ??
Operator führt aus.(Ihr Code hat keine Besetzung).
Wenn customer
ist eine Zeile in einem typisierten Datensatz, ändern Sie die Spalten NullValue
Eigenschaft im Designer.
Andere Tipps
null und dbnull sind nicht gleich.System.dbnull ist ein tatsächliches Objekt.
Das Problem ist, dass der AlternatePhoneNumber
eine Zeichenfolge ist.Dbnull ist nicht.
Versuchen Sie es stattdessen:
generasacodicetagpre.tun dies:
generasacodicetagpre.dbnull ist ein Typ mit einem einzelnen Wert und ist nicht mit einer Null-Zeichenfolge-Referenz derselbe, weshalb Sie den generationspflichtigen Code nicht verwenden können.Sie könnten dies jedoch tun:
generasacodicetagpre.Wie in anderen Antworten angegeben, null
bedeutet eine Referenz, die sich auf kein Objekt bezieht, während DBNull
ist eine von ADO.NET bereitgestellte Klasse angeben wenn ein Feld oder Wert in der Datenbank (oder in einer Datentabelle) NULL ist.
Während Sie die verwenden können bedingter (ternärer) Operator (?:) um zu tun, was du willst:
AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull
? ""
: customer.AlternatePhoneNumber;
Ich neige dazu, dies in einem zusammenzufassen Erweiterungsmethode:
static class NullExtensions
{
public static T WhenNull<T>( this object value, T whenNullValue )
{
return (value == null || value is DBNull)
? whenNullValue
: (T)value;
}
}
was meiner Meinung nach den Code leichter lesbar und verständlich macht.
AlternatePhoneNumber = customer.AlternatePhoneNumber.WhenNull( "" );
dbnull ist kein echter "null".
das "??"- Der Bediener erkennt nur NULL-Referenzen, nicht Objekte, die das Verhalten von "NULL" emulieren.