2011-11-08 20 views
8

El método DateTime.TryParse toma un DateTime como argumento, no como DateTime? ?Cómo analizar Nullable <DateTime> desde un SqlDataReader

En este momento tengo el siguiente código:

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

donde _placed es de tipo

Nullable<DateTime> _placed = null; 

¿Qué es una forma de evitar eso?

+0

¿Es la columna 'Colocado' realmente una cadena en el DB? ¿Si no, entonces qué es? – LukeH

+0

No, Colocado es un campo DateTime. ¿Debo usar el valor de retorno del lector ["Colocado"] directamente? – lowerkey

+0

Sí. Vea la respuesta de Dylan sobre cómo hacerlo. – LukeH

Respuesta

19

¿Qué hay de esto en su lugar:

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

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

+1. O, si '_placed' necesita ser asignado en cualquier caso:' _placed = reader.IsDBNull (x)? (DateTime?) Null: reader.GetDateTime (x); ' – LukeH

0

Es normal. El argumento de salida no se establece si falla el análisis. Entonces, si el tipo de wargument fuera Nullable, habría sido una información redundante.

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

Utilice el método del lector IsDBNull para determinar si el valor es nulo antes de intentar analizar una fecha fuera de él.

6

Solo una combinación de la mejor respuesta y el mejor comentario. Gracias @ Dylan-Meador y @LukeH.
(Ed. Nota: Para la larga cola Creo que esta versión se ahorrará un montón de tiempo humana.)

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

Es realmente una lástima que en esta era ADO no tenga un asistente incorporado de DateTime que se pueda anular. – yzorg

2

Y aquí es la respuesta @yzorg 's se convirtió en un método de extensión reutilizable

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); 
    } 
} 
Cuestiones relacionadas