日期时间空值
Posted
技术标签:
【中文标题】日期时间空值【英文标题】:DateTime null values 【发布时间】:2017-03-22 15:41:15 【问题描述】:我有以下代码应该检查数据读取器中的值是否不为空。如果是,则该方法应返回空值或空 DateTime 以供以后使用。
private static DateTime safeGetDateTime(OleDbDataReader dr, int idx)
if (!dr.IsDBNull(idx))
return dr.GetDateTime(idx);
else return DateTime.MinValue;
我尝试只返回 null,但由于方法返回类型是“DateTime”,所以这不起作用。然后,如果数据读取器拾取空值,我尝试返回 DateTime.MinValue。这给了我以下错误:
SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。
感谢任何帮助。
【问题讨论】:
使用可以为空的DateTime?
如果您注意到错误来自SqlDateTime
而不是DateTime
,我想您会发现它在return dr.GetDateTime(idx);
行而不是return DateTime.MinValue;
行上引发了异常。
@MichaelL。这似乎不太可能,因为数据库中的值已经是有效的 SQL 日期。我怀疑OP误解了错误的位置,实际上是在将值写入数据库时,而不是在从数据库中读取时。
您确定这是错误的位置吗?将值写入数据库时可能会发生该错误(尽管在您更改代码之前,您之前的 null 转换错误会在这里发生)。
@JeffreyLWhitledge 好点,你是对的。
【参考方案1】:
由于 CLR 和 SQL 服务器中的 DateTime.MinValue 不同,您会收到此错误。
我建议你使用Nullable Type
【讨论】:
【参考方案2】:让方法返回一个Nullable<DateTime>
,那么就可以返回null
:
private static DateTime? safeGetDateTime(OleDbDataReader dr, int idx)
if (!dr.IsDBNull(idx))
return dr.GetDateTime(idx);
else
return null;
您仍然需要检查返回值,您的错误表明您在另一个 sql 查询中使用此值作为参数,您必须在 null
-case 中分配 DBNull.Value
。
DateTime? date = safeGetDateTime(reader, columnOrdinal);
yourSqlParameter.Value = date.HasValue ? (object)date.Value : DBNull.Value;
【讨论】:
【参考方案3】:错误一定来自您将DateTime.MinValue 分配给SqlDateTime
参数。
DateTime.MinValue:
此常量的值相当于 0001 年 1 月 1 日 00:00:00.0000000。
SqlDateTime.MinValue
SqlDateTime 结构的最小有效日期是 1753 年 1 月 1 日。
所以如果你打算在SqlDateTime
参数中使用这个方法的返回,你可以尝试返回SqlDateTime.MinValue:
return (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
或者,你可以尝试使用DateTime?
作为返回类型,这样你就可以返回null
【讨论】:
【参考方案4】:你可以保持safeGetDateTime
原样,但是当你将值写回数据库时,你应该检查它是否是DateTime.MinValue
。如果是,那么您应该将空值写入数据库。
if (value == DateTime.MinValue)
comm.Parameters.AddWithvalue("@mydate", null);
else
comm.Parameters.AddWithValue("@mydate", value);
【讨论】:
以上是关于日期时间空值的主要内容,如果未能解决你的问题,请参考以下文章