Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to manage parsing an null object for DateTime to be used with ADO.NET as DBNULL

I have two DateTime objects, BirthDate and HireDate. They are correctly formatted as a string and when I pass them through to my data access layer, they need to be parsed into a DateTime object.

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

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

But sometimes, the strings hire and birth are null or empty "", if the code is run like this, I get a FormatException error from Parsing a empty string. How can I manage empty parses and allow the DateTime, if empty or null, be accepted as DBNull.Value?

I still cannot manage incase the user does not pass through a DateTime string, then the parse crashes my code.

My parameter for birth date is as follows and checks the variable if null, then use DBNull.Value.

like image 775
GivenPie Avatar asked Nov 25 '12 21:11

GivenPie


People also ask

How do you handle null in DateTime?

Using the DateTime nullable type, you can assign the null literal to the DateTime type. A nullable DateTime is specified using the following question mark syntax. DateTime? The following is the code to implement Nullable Datetime.

Can you set DateTime to null?

The DateTime variable type cannot be set to null, it needs a value, in this case I am going to set it to the DateTime 's minimum value if there is no value.

Can we compare DateTime with null in C#?

DateTime CAN be compared to null; It cannot hold null value, thus the comparison will always be false. DateTime is a "Value Type". Basically a "value type" can't set to NULL.

How do you check if a DateTime field is not null or empty?

you can directly check if Datetime field is empty using == null condition as shown in example below. Hi Oussama, Greetings to you!


3 Answers

The Parse method can't handle empty strings, but you can use nullable DateTime and do something like this:

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

But even safer would be using TryParse instead:

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

Then for storing this value, you can test hD.HasValue:

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

Since C# 7, you can use shorter syntax for inline out parameters and you can avoid nullable type altogether:

if (DateTime.TryParse(hire, out var hD)) { /* use hD */ }
else { /* use DBNull.Value */ }
like image 123
Honza Brestan Avatar answered Oct 13 '22 19:10

Honza Brestan


You need to use nullable date times - the shortcut syntax would be DateTime? (note the ? at the end).

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

You can test for hD.HasValue and if it doesn't use DbNull.Value instead.

like image 30
Oded Avatar answered Oct 13 '22 20:10

Oded


If you use this method, any thing that is not a correct date will return a 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;
}
like image 1
Jens Granlund Avatar answered Oct 13 '22 20:10

Jens Granlund