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.

War es hilfreich?

Lösung

Der ?? Der Operator gilt nur für tatsächliche nullS.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top