2011-11-08 18 views
8

Il metodo DateTime.TryParse richiede un DateTime come argomento, non un DateTime? ?Come analizzare Nullable <DateTime> da un SqlDataReader

In questo momento ho il seguente codice:

if(!DateTime.TryParse(reader["Placed"].ToString(), out _placed)){ 
    throw new Exception("Order's placed datetime could not be parsed."); 
} 

dove _placed è di tipo

Nullable<DateTime> _placed = null; 

cosa è un modo per aggirare questo?

+0

La colonna 'Posizionato' è effettivamente una stringa nel db? Se no, allora che cos'è? – LukeH

+0

No, inserito è un campo DateTime. Dovrei usare direttamente il valore di ritorno ["Inserito"] del lettore? – lowerkey

+0

Sì. Vedi la risposta di Dylan su come farlo. – LukeH

risposta

19

Che ne dite di questo, invece:

int x = reader.GetOrdinal("Placed"); 

if(!reader.IsDBNull(x)) 
    _placed = reader.GetDateTime(x); 
+8

+1. Oppure, se '_placed' deve essere assegnato in entrambi i casi:' _placed = reader.IsDBNull (x)? (DateTime?) Null: reader.GetDateTime (x); ' – LukeH

0

È normale. L'argomento out non viene impostato se l'analisi fallisce. Quindi, se il tipo di wargument fosse Nullable, sarebbe stata un'informazione di successo.

1
DateTime? _placed = null; 
DateTime d2; 
bool isDate = DateTime.TryParse(reader["Placed"].ToString(), out d2); 
if (isDate) _placed = d2; 
1

Utilizzare il metodo del lettore IsDBNull per determinare se il valore è nullo prima di tentare di analizzare una data fuori di esso.

6

Solo una combinazione di risposta superiore e commento principale. Grazie @ Dylan-Meador e @LukeH.
(Ed. Nota: Per la coda lunga penso che questa versione sarà risparmiare un sacco di tempo umano.)

int x = reader.GetOrdinal("Placed"); 
DateTime? _placed = reader.IsDBNull(x) ? (DateTime?)null : reader.GetDateTime(x); 
+2

È davvero un peccato che in questa età ADO non abbia un helper DateTime annullabile. – yzorg

2

E qui è la risposta s' @yzorg trasformato in un metodo di estensione riutilizzabile

public static class SqlDataReaderExtensions 
{ 
    public static DateTime? GetNullableDateTime(this SqlDataReader reader, string fieldName) 
    { 
     int x = reader.GetOrdinal(fieldName); 
     return reader.IsDBNull(x) ? (DateTime?) null : reader.GetDateTime(x); 
    } 
}