无法从“ System.DateTime输出?”中进行转换?退出System.DateTime

时间:2018-08-16 13:16:37

标签: c# sql

  if(startDate == "")
  {
      DateTime? startDateParser = null;
      DateTime.TryParse(startDate, out startDateParser);
  }

如果字符串startDate为空,我希望它输出一个null,但是会抱怨

  

无法从“输出System.DateTime吗?”进行转换? “退出System.DateTime”

将null解析为该参数接受null的sql语句,但是解析为01/01/0001

command.Parameters.AddWithValue("@StartDate", (r.StartDate == null ? DBNull.Value : (object)r.StartDate));

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:0)

System.DateTime不能为null。如果您需要此类型的参数以允许空值,则可以按照错误提示进行操作,并使用允许空值的System.DateTime?

SO与该主题相关的问题很多,例如:datetime-null-value

从接受的答案中摘录:

  

对于普通的DateTime,如果您根本不初始化它们,则它们将与DateTime.MinValue匹配,因为它是一个值类型而不是引用类型。

     

您还可以使用可为空的DateTime,如下所示:

DateTime? MyNullableDate;
  

或更长的形式:

Nullable<DateTime> MyNullableDate;
  

最后,有一种内置的方式可以引用任何类型的默认值。对于参考类型,这将返回null,但是对于我们的DateTime示例,它将与DateTime.MinValue相同:

default(DateTime)

答案 1 :(得分:0)

使用此代码解决“无法从'out System.DateTime?' to 'out System.DateTime'"转换的问题。

DateTime tmpDate;
DateTime? dateValue = DateTime.TryParse(startDate, out temp) ? temp : (DateTime?)null;

可以将您解析的日期值用于result变量。您可以使用null或最小值。

object resultVal = dateValue.HasValue ? dateValue.Value : DateTime.MinValue; // or DBNull.Value

command.Parameters.AddWithValue("@StartDate",resultVal  );

答案 2 :(得分:0)

请记住,使用out,您可以给方法您的变量进行操作。 DateTime结构是8字节的值类型。用于保存此类值的变量为8个字节,并且应直接包含该值。

DateTime?是可为空的DateTime-也是一个结构。但是Nullable<T>始终包含基础的实例,而包含额外的bool。这意味着它将至少为9个字节(实际上,在大多数常见实现中几乎可以确定为12个字节)。这种类型的变量为12个字节,其中包含基础值和bool(并且bool在布局中可能是“第一个”)

现在您知道为什么,如果要为其他一些可操作的方法提供变量,则它必须是正确正确的变量,才能使该方法中的代码正常工作正确地使用它。