问题
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.
回答1:
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.
回答2:
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 */ }
回答3:
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;
}
来源:https://stackoverflow.com/questions/13555505/how-to-manage-parsing-an-null-object-for-datetime-to-be-used-with-ado-net-as-dbn