2012-04-19 7 views
8

Ho letto il mio database usando DataReader.C# Object null check

e alcune righe non hanno valore di fdate.

così quando Converto la data null in DateTime, si verifica un errore.

Come posso controllare il campo vuoto o no?

AdsCommand cmd = conn.CreateCommand(); 
cmd.CommandText = "select name,fdate from abc"; 

AdsDataReader reader = cmd.ExecuteReader(); 

DateTime flsdate = (reader["fdate"].Equals(null))? Convert.ToDateTime(reader["fdate"]) : DateTime.Today; 

Ho provato con Equals, ma non funziona.

qualcuno sa come controllare l'oggetto nullo per evitare errori di conversione?

Grazie!

+0

Utilizzare '==' o '! =' Non '.Equalisti'. Inoltre, potrebbe essere necessario controllare 'DBNull', non solo' null'. (Sì, sono diversi) .. – Servy

+0

Possibile doppione? http://stackoverflow.com/questions/3432974/datareader-is-null-or-empty –

risposta

11

Come tutti ti hanno indicato come risolvere il problema, sto cercando di fornirti le informazioni su quale sia la differenza tra NULL e DBNull.

  • null e DBNull sono diversi.

  • null non è un'istanza di alcun tipo. DBNull è una classe singleton con un'istanza: DBNull.Value.

  • null rappresenta un riferimento non valido dove come DBNull.Value rappresenta un valore inesistente nel DB.

  • DBNull.Value è ciò che i provider db forniscono per un valore inesistente in una tabella.

Con tale sfondo (reader["fdate"].Equals(null)) non è corretto da utilizzare qui. Devi verificarlo con DBNull.Value. Se è di tipo DBNull, o se è uguale a DBNull.Value, quindi assegnare quale valore sempre desiderato.

+3

+1 per spiegare effettivamente qualcosa. Mi sono preso la libertà di modificarlo un po '; per favore, rispedisci le modifiche con le quali non sei d'accordo. – phoog

+0

@phoog Grazie per aver reso tutto migliore. – Sandeep

2
DateTime flsdate = reader["fdate"].Equals(DBNull.Value) 
    ? Convert.ToDateTime(reader["fdate"]) 
    : DateTime.Today; 

Ma sembra pericoloso impostare la data su Today. Mi piacerebbe fare questo, invece:

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value) 
    ? Convert.ToDateTime(reader["fdate"]) 
    : (DateTime?)null; 

Inoltre, se il TPE sottostante della colonna fdate è già DateTime, non utilizzare System.Convert:

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value) 
    ? (DateTime?)reader["fdate"]) 
    : null; 
1

Provare quanto segue:

DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value 
    ? DateTime.ParseExact(reader["fdate"]) 
    : DateTime.Today; 
1
DateTime flsdate = DateTime.Today; 
if(reader["fdate"] != null) 
    flsdate = Convert.ToDateTime(reader["fdate"]) 
4

In una situazione come questa mi piace rappresentare colonne del database annullabili ad un tipo di riferimento (stringa per varchar) o avvolto tipo di valore Nullable (DateTime?). In questo modo stai rappresentando più accuratamente lo schema del database nel tuo programma.

Questo permette anche di scrivere in modo più pulito la logica di conversione utilizzando il formato: (? DateTime)

DateTime? fdate = datareader["fdate"] as DateTime?; 

Questo cast non riuscirà nel caso in cui il risultato DataReader è un DBNull e FDATE sarà impostato sul valore predefinito , che è nullo. A quel punto è possibile ottenere il valore reale desiderato controllando se il tipo nullable ha un valore o meno (fdate.HasValue), e in caso contrario, utilizzando il valore predefinito - DateTime.Today.