2010-01-13 9 views
7

ho la seguente riga di codiceCome può DBNULL non uguale DBNull

if (DBNull.Value.Equals(o) || o != null) 

dove o è object o in row.ItemArray Continuo a ricevere un errore di ->

Xml type "List of xdt:untypedAtomic" does not support a conversion from Clr type "DBNull" to Clr type "String".

Quello che non mi capisco è che quando passo il mio codice questo if dovrebbe prendere questo e l'esecuzione della mia azione alternativa, ma non lo fa?

Qualcuno può per favore versare un po 'di luce per me.

Grazie!

+0

puoi pubblicare altro codice? dove viene assegnato? – hackerhasid

+1

Qual è il risultato di 'Console.WriteLine (o.GetType(). Name);'? – jason

+2

penso che sia un po 'strano prima si confronta con DBNull e poi con non null – tga

risposta

1

può essere tale confronto aiuta

if (!o.GetType().Equals(DBNull.Value))

o

if (o is DBNull)

6

penso che problema è che in realtà

DBNull.Value == null 
//is always false 

Il DBNull è una classe speciale per il confronto sui valori restituiti dalla dB in modo è effettivamente necessario verificare una condizione nullo E un DBNull.value se l'array contiene entrambi.

MODIFICA: Spiacente, guardando più vicino al codice, potrebbe essere necessario invertire l'operazione. Se o == null la tua prima affermazione esploderà con la tua eccezione. Prova:

if (o != null || o == DBNull.Value) 
+1

not if o == null ... –

+0

questa modifica è errata, con un test esatto opposto di cosa si intende. Come afferma correttamente @ThomasLevesque, deve essere invece "if (o == null || o == DBNull.Value)". Ma la prima affermazione non è un problema, ma questo stile porta al problema di molti errori di codifica in cui genera eccezioni quando l'oggetto è nullo. quindi è * molto * buono da controllare sempre per null o not null * first *, prima di fare qualsiasi altra cosa con il valore. –

+1

gli errori che "esplodono codice" si verificano quando si prova qualcosa come 'if (o.ToString()) {...}' perché quando poi o è nullo, qualsiasi * proprietà * o metodo funziona come '.ToString() 'genererà un errore. quindi è sempre una buona pratica assicurarsi di testare prima null o no null. Comunque 'if (DBNull.Value.Equals (o) || o! = Null)' non sta accedendo a nessuna proprietà di o. E se il metodo gestisce correttamente un valore nullo, allora non ci sono bug quando o è nullo. Ma MOLTI programmatori dimenticano di provare per null, quindi passare null a molti metodi causa spesso molti problemi perché, onestamente, un sacco di codice è sciatto. –

Problemi correlati