2012-11-25 9 views
9

Ho due oggetti DateTime, BirthDate e HireDate. Sono formattati correttamente come una stringa e quando li passo al livello di accesso ai dati, devono essere analizzati in un oggetto DateTime.Come gestire l'analisi di un oggetto nullo per DateTime da utilizzare con ADO.NET come DBNULL

DateTime hD = DateTime.Parse(hire);    
DateTime bD = DateTime.Parse(birth); 

//incase of a datestring being passed through 
dateStringPassed = "7/2/1969"; 

Ma a volte, le corde e le hirebirth sono nulli o vuoto "", se il codice viene eseguito in questo modo, ottengo un errore FormatException da analizzare una stringa vuota. Come posso gestire le analisi vuote e consentire che DateTime, se vuoto o nullo, venga accettato come DBNull.Value?

Non riesco ancora a gestirlo se l'utente non passa attraverso una stringa DateTime, quindi il parse arresta il mio codice.

Il mio parametro per la data di nascita è il seguente e controlla la variabile se null, quindi utilizza DBNull.Value.

risposta

2

È necessario utilizzare la data nullable - la sintassi di scelta rapida è DateTime? (notare la ? alla fine).

DateTime? hD = null; 
if(!string.IsNullOrWhitespace(hire)) // string.IsNullOrEmpty if on .NET pre 4.0 
{ 
    hD = DateTime.Parse(hire);    
} 

è possibile testare per hD.HasValue e se non usa DbNull.Value invece.

+0

si può scrivere un esempio con DateTime bD = DateTime.Parse (nascita)? Usare un '?' Alla fine funziona anche per un 'int'? – GivenPie

+0

@GivenPie - Sì, sarebbe per un 'int' e qualsiasi tipo di valore. – Oded

+0

Cool, grazie Odd! – GivenPie

9

Il metodo Parse non può gestire stringhe vuote, ma è possibile utilizzare DateTime nullable e fare qualcosa del genere:

DateTime? hD = String.IsNullOrEmpty(hire) ? (DateTime?)null : DateTime.Parse(hire) 

Ma ancora più sicuro sarebbe utilizzando TryParse invece:

DateTime? hD = null; 
DateTime.TryParse(hire, out hD); 

Poi per la memorizzazione di questo valore, è possibile verificare hD.HasValue:

if(hD.HasValue) { /* use hD */ } 
else { /* else use DBNull.Value */ } 

Poiché C# 7, è possibile utilizzare la sintassi più breve per linea fuori dei parametri e si può evitare il tipo nullable del tutto:

if (DateTime.TryParse(hire, out var hD)) { /* use hD */ } 
else { /* use DBNull.Value */ } 
+1

Credo che dovrai lanciare il' null' in quell'operatore ternario per ottenere quella linea da compilare. Entrambi i lati di ':' devono essere dello stesso tipo o tipi che hanno conversioni implicite tra di loro. – Oded

+0

Hai ragione, modifico la mia risposta. –

+1

E quell'ultima riga: non vedo come potresti lanciarlo in modo che il compilatore possa accettarlo. – Oded

0

Se si utilizza questo metodo, qualsiasi cosa che non è una data corretta restituirà un DBNull.Value:

/// <summary> 
/// Parses a date string and returns 
/// a DateTime if it is a valid date, 
/// if not returns DBNull.Value 
/// </summary> 
/// <param name="date">Date string</param> 
/// <returns>DateTime or DBNull.Value</returns> 
public static object CreateDBDateTime(string date) 
{ 
    DateTime result; 
    if (DateTime.TryParse(date, out result)) 
    { 
     return result; 
    } 
    return DBNull.Value; 
} 
Problemi correlati