質問

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.

役に立ちましたか?

解決 2

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.

他のヒント

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 */ }

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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top