Domanda

Ho una tabella dei dati Oracle che recupera colonne che siano nulle.Quindi immagino di mantenere il codice bello e semplice che userei il ??operando.AlternatorefoneNumber è una stringa nel mio modello C #.

AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""
.

Tuttavia, anche con quel codice ho ancora l'errore.

System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
.

So cosa significa l'errore ma perché è ??Non utilizzabile su Dbnull?Non è nullo e dbnull essenzialmente lo stesso?

Grazie.

È stato utile?

Soluzione

L'operatore ?? si applica solo a generatori effettivi nulls.

null e DBNull.Value non sono uguali;DBNull.Value è semplicemente un oggetto segnaposto.

Inoltre, tale eccezione proviene dall'interno della proprietà AlternatePhoneNumber, prima dell'esecuzione del funzionamento ??.(Il tuo codice non ha un cast).

Se customer è una riga in un set di dati digitato, modificare la proprietà NullValue della colonna nel progettista.

Altri suggerimenti

Null e Dbnull non sono uguali.System.dbnull è un oggetto reale.

Il problema è che AlternatePhoneNumber è una stringa.Dbnull non è.

prova questo invece:

AlternatePhoneNumber = (customer.AlternatePhoneNumber as string) ?? ""
.

Fai questo:

public T IfNull<T>(object o, T value)
{
   return (o == DbNull.Value) ? value : (T)o;       
}
.

Dbnull è un tipo con un singolo valore, e non è la stessa di un riferimento di stringa null, motivo per cui non è possibile utilizzare ??.Potresti farlo comunque:

string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;
.

Come altri stati di risposte, null significa un riferimento che si riferisce a nessun oggetto, mentre DBNull è una classe fornita da ADO.NET a indicare quando un campo o un valore è null nel database (o inun datatariabile).

Mentre è possibile utilizzare operatore condizionale (Ternario)(? :) per fare ciò che vuoi:

AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull 
                           ? "" 
                           : customer.AlternatePhoneNumber;
.

Tendo a avvolgerlo in un Metodo di estensione :

static class NullExtensions
{
    public static T WhenNull<T>( this object value, T whenNullValue )
    {
        return (value == null || value is DBNull)
            ? whenNullValue
            : (T)value;
    }
}
.

che trovo rende il codice più facile da leggere e capire.

AlternatePhoneNumber = customer.AlternatePhoneNumber.WhenNull( "" );
.

Dbnull non è un vero "NULL".

the "??"- L'operatore rileva solo null - riferimenti, non oggetti che emulano il comportamento "null".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top