【问题标题】: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 好点,你是对的。

标签: c# sql datetime oledbdatareader


【解决方案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);
        }
        

        【讨论】:

          猜你喜欢
          • 2010-09-18
          • 2011-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多