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));
任何帮助将不胜感激
答案 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
在布局中可能是“第一个”)
现在您知道为什么,如果要为其他一些可操作的方法提供变量,则它必须是正确正确的变量,才能使该方法中的代码正常工作正确地使用它。