我有以下代码,用于检查数据读取器中的值是否为空。如果是,则该方法应返回null值或null DateTime以供稍后使用。
private static DateTime safeGetDateTime(OleDbDataReader dr, int idx)
{
if (!dr.IsDBNull(idx))
return dr.GetDateTime(idx);
else return DateTime.MinValue;
}
我试过只返回null但是因为方法返回类型是" DateTime",这不起作用。然后,如果datareader拾取了null,我尝试返回DateTime.MinValue。这给了我以下错误:
SqlDateTime溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。
感谢任何帮助。
答案 0 :(得分:4)
由于CLR和SQL服务器中的DateTime.MinValue不同,您收到此错误。
我建议您使用Nullable Type
答案 1 :(得分:3)
让方法返回Nullable<DateTime>
,然后您可以返回null
:
private static DateTime? safeGetDateTime(OleDbDataReader dr, int idx)
{
if (!dr.IsDBNull(idx))
return dr.GetDateTime(idx);
else
return null;
}
您仍然需要检查返回值,您的错误表明您在另一个sql查询中使用此值作为参数,您必须在DBNull.Value
- 案例中指定null
。
DateTime? date = safeGetDateTime(reader, columnOrdinal);
yourSqlParameter.Value = date.HasValue ? (object)date.Value : DBNull.Value;
答案 2 :(得分:2)
错误必须来自您将https://cwiki.apache.org/confluence/display/solr/Pagination+of+Results分配给SqlDateTime
参数。
<强> DateTime.MinValue:强>
此常量的值相当于0001年1月1日00:00:00.0000000。
<强> SqlDateTime.MinValue 强>
SqlDateTime结构的最小有效日期是1753年1月1日。
因此,如果您要在SqlDateTime
参数中使用此方法的返回值,则可以尝试返回DateTime.MinValue:
return (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
或者,您可以尝试使用DateTime?
作为返回类型,这样您就可以返回null
答案 3 :(得分:0)
您可以保持safeGetDateTime
不变,但是当您将值写回数据库时,您应该检查它是否为DateTime.MinValue
。如果是,那么你应该为数据库写一个空值。
if (value == DateTime.MinValue)
{
comm.Parameters.AddWithvalue("@mydate", null);
}
else
{
comm.Parameters.AddWithValue("@mydate", value);
}