DateTime null值

时间:2017-03-22 15:41:15

标签: c# sql datetime oledbdatareader

我有以下代码,用于检查数据读取器中的值是否为空。如果是,则该方法应返回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之间。

感谢任何帮助。

4 个答案:

答案 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);
}