如何管理解析DateTime的空对象以与ADO.NET一起用作DBNULL

Giv*_*Pie 10 c# ado.net datetime parsing dbnull

我有两个DateTime对象,BirthDate和HireDate.它们被正确格式化为字符串,当我将它们传递给我的数据访问层时,需要将它们解析为DateTime对象.

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

//incase of a datestring being passed through
dateStringPassed = "7/2/1969";
Run Code Online (Sandbox Code Playgroud)

但有时,字符串hirebirth为空或空"",如果代码运行这样的,我是从解析空字符串得到出现FormatException错误.如何管理空解析并允许DateTime(如果为空或null)被接受为DBNull.Value

我仍然无法管理用户没有通过DateTime字符串,然后解析崩溃我的代码.

我的出生日期参数如下,检查变量是否为null,然后使用DBNull.Value.

Hon*_*tan 13

Parse方法无法处理空字符串,但您可以使用可为空的DateTime并执行以下操作:

DateTime? hD = String.IsNullOrEmpty(hire) ? (DateTime?)null : DateTime.Parse(hire)
Run Code Online (Sandbox Code Playgroud)

但更安全的是使用TryParse:

DateTime? hD = null;
DateTime.TryParse(hire, out hD);
Run Code Online (Sandbox Code Playgroud)

然后,为了存储此值,您可以测试hD.HasValue:

if(hD.HasValue) { /* use hD */ }
else { /* else use DBNull.Value */ }
Run Code Online (Sandbox Code Playgroud)

从C#7开始,你可以使用更短的语法来内联输出参数,你可以完全避免使用可空类型:

if (DateTime.TryParse(hire, out var hD)) { /* use hD */ }
else { /* use DBNull.Value */ }
Run Code Online (Sandbox Code Playgroud)


Ode*_*ded 5

您需要使用可为空的日期时间 - 快捷语法将是DateTime?(注意?最后的)。

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

您可以测试一下hD.HasValue是否可以代替DbNull.Value