【问题标题】:Pass a NULL in a parameter to a DateTime field in a stored procedure将参数中的 NULL 传递给存储过程中的 DateTime 字段
【发布时间】:2011-07-08 02:39:31
【问题描述】:

我有一个存储过程,它使用我提供的参数更新数据库,但我无法将 NULL 传递给存储过程

我需要设为 NULL 的字段是 DateTime 字段

DB.Parameters.AddWithValue("@date", NULL)

这给了我错误

'NULL' 未声明。不再支持“Null”常量;改用“System.DBNull”

所以我尝试了

DB.Parameters.AddWithValue("@date", DBNull.Value.ToString())

但这会在列中产生值1900-01-01 00:00:00.000,因为它将"" 传递给字段

我也试过了

DB.Parameters.AddWithValue("@date", DBNull.Value)

但它会产生这个错误

“System.DBNull”类型的值无法转换为“String”。

有人有什么想法吗?

【问题讨论】:

  • 完全省略参数会怎样?
  • @Mick,那也不行。我想看看他的 sp 期待什么参数
  • 谨慎使用.AddWithValue 调用-如果您传入DBNull.Value,.NET 在这种情况下如何知道您的参数应该是什么type?请参阅 LukeH 的回答 - 具体,您将为自己省去很多悲伤! (而且真的很难找到错误!)

标签: asp.net sql vb.net parameters null


【解决方案1】:

或者你可以像这样添加你的参数,如果你的变量为空,它会在数据库中给它一个空值:

DB.Parameters.AddWithValue("@date", myDateTime ?? (object)DBNull.Value);

您需要将其设置为 Amit 提到的可空类型。

更多详情和背景请访问http://evonet.com.au/overview-of-c-nullable-types/

【讨论】:

    【解决方案2】:

    尝试这样的事情,使用Add 而不是AddWithValue

    DB.Parameters.Add("@date", SqlDbType.DateTime).Value = DBNull.Value;
    

    【讨论】:

    • +1 准确 - 如果您传入 DBNull.Value,ADO.NET 应该如何确定您的参数将是什么 type ?清楚具体!
    【解决方案3】:

    试试这个

    如果您正在使用类及其属性,并且这些属性值用作参数,那么您可以这样做

    将属性的签名更改为

    public DateTime? myDateTime = null;// Here ? is used to make the property nullable.
    

    此外,如果您的日期列是 varchar 类型,则将其更正为 Date (Sql2008) / DateTime(2005)。

    //把参数改成这个

    @SomeDate datetime = null (as suggested by chris)
    

    允许字段接受null,然后将值传递为

    DB.Parameters.Add("@date", DBNull.Value)
    

    【讨论】:

    • 不会改变任何东西 - 问题是使用 AddWithValueDBNull.Value,ADO.NET 运行时不知道您希望它是什么类型.....
    【解决方案4】:

    这是一个例子。这对我有用

    if(obj.myDate == DateTime.MinValue)
    {
        aCommand.Parameters.Add("dateParameter", SqlDbType.Date).Value = DBNull.Value;
    }
    else
    {
        aCommand.Parameters.Add("dateParameter", SqlDbType.Date).Value = obj.myDate ;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 2011-07-22
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 2016-04-05
      相关资源
      最近更新 更多