【问题标题】:Why date filed is not taking null but 1900-01-01? [duplicate]为什么提交的日期不是 null 而是 1900-01-01? [复制]
【发布时间】:2016-11-30 06:29:52
【问题描述】:

我一直在开发后端,即在 Sql server 2012 中。我已在表中将字段声明为日期,即 ParawiseDate 日期时间

我从 C# 传递一个 NULL 给它,即

sqlcom.Parameters.AddWithValue("@ParawiseDate", NULL);

问题:

它将日期保存为 1900-01-01 而不是 NULL。我试过"",也被保存为1900-01-01

为什么?

【问题讨论】:

  • 什么是NULLNULL 不是 C# 关键字。
  • 同时避免AddWithValue,因为它的类型推断并不总是准确的。始终指定明确的 SqlDbType 值。

标签: c# sql sql-server c#-4.0


【解决方案1】:

确保它允许 ParawiseDate 列中的空值。也不要传递 Null 尝试 DBNull.value

sqlcom.Parameters.AddWithValue("@ParawiseDate", DbNull.Value);

【讨论】:

  • 大声笑,同时发布。嗯,这就是他得到的,Date 的默认值。该方法没有空值,这将是默认值。
【解决方案2】:
SELECT cast(NULLIF(t.[ParawiseDate],'') AS DATE) 
FROM tablename t 

【讨论】:

    【解决方案3】:

    我相信对于 DateTime,您可以使用“?”声明类型,否则它们将默认为 1900-01-01

    DateTime ? Parameter;
    

    也可以试试传入

    typeof(System.DateTime) 
    

    而不是NULL,在第二个参数上

    【讨论】:

    • 我做到了。我已经这样做了
    • 没有效果,还是一样
    • 我明白了,对不起,typeof(System.DateTime)
    【解决方案4】:

    了解什么是数据的二进制表示以及允许进行哪些类型转换是很重要的。没有它,任何程序员都有些盲目。对于这种情况,在 MS SQL 中,默认日期值为 1900-01-01。在较旧的 CLR AddWithValue 中,使用 DBNull.Value 作为值相当于将字段设置为默认值。 我没有处理 4.0 CLR 环境,但我可能期望 NULL 可以转换为 DBNull?在任何情况下,它都不是日期值,或者是否可以将 NULL 隐式转换为具有默认值的 Date? (后者会说 MS 再次远离标准,NULL 现在必须等于指向任何对象的指针)很可能是未记录的副作用。

    public SqlParameter AddWithValue(
        string parameterName,
        object value
    )
    

    参数

    • parameterName 类型:System.String 参数的名称。

    • value 类型:System.Object 要添加的值。使用DBNull.Value 代替null,表示空值。

    https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue(v=vs.110).aspx

    Date 和 DateTime 不能为 NULL,但可以将 table 中的字段设置为允许 null 值。出于安全原因,通常不读取数据会导致获取默认值。这需要单独检查(isDBNull?)

    在 SQL(至少 Microsoft 风格)中只有合法的日期值是 0001-01-01 到 9999-12-31 ,应该明确给出,否则将使用默认值。

    【讨论】:

      猜你喜欢
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 2021-02-17
      • 1970-01-01
      • 2015-03-02
      • 2019-06-12
      • 1970-01-01
      相关资源
      最近更新 更多