【问题标题】:How to assign a value to sqlparameter NULL values without checking for null or 0?如何在不检查 null 或 0 的情况下为 sqlparameter NULL 值赋值?
【发布时间】:2014-02-07 08:27:40
【问题描述】:

需要以下检查来检查空值。有什么办法可以直接做吗?

 if(node.ID==0)
 {
   cmd.Parameters["@ID"].Value = DBNull.Value;
 }
  else
  {
    cmd.Parameters["@ID"].Value = node.ID;
  }

有没有办法我们可以进行这种检查,以及我们可以避免对每个值进行这种重复检查的设计? (顺便说一句,在我的情况下,0 被解释为 NULL 只是一个逻辑,但我对字符串等可空对象也有同样的要求)

【问题讨论】:

  • 你可以使用三元运算符(?
  • 请注意,对于可空类型(引用或可空值类型),这将是一个完全不同的答案。您是否有任何理由没有将您的 ID 属性设置为 Nullable<int> 或其他?
  • 如果您不小心将您并不真正想要的内容写入数据库,该怎么办?您可能会意识到需要事先检查。当异常触发时,有时这并不是一件坏事。
  • @JonSkeet 我不确定 Nullable 是否可以安全使用(不熟悉),以防其他人稍后使用它,但我会尝试一下。

标签: c# database sqlcommand dbnull


【解决方案1】:

您可以使用?: Operator

cmd.Parameters["@ID"].Value = node.ID == 0 ? (object)DBNull.Value : node.ID;

【讨论】:

    【解决方案2】:

    对于可空类型,我只使用扩展方法:

    public static object CoalesceNullToDBNull(this object input)
    {
        return input == null ? DBNull.Value : input;
    }
    

    然后将其用作:

    cmd.Parameters["Foo"].Value = someExpression.CoalesceNullToDBNull();
    

    (当然,你可以给它一个更短的名字。)

    但这对您的情况没有帮助,因为您正在尝试将非空值合并为空值。我个人会考虑重新设计您的模型 - 对可以为空的值使用可空类型,而不是使用幻数。但是,您可以仍然使用通用扩展方法:

    public static object CoalesceDefaultToDBNull<T>(this T input)
    {
        return EqualityComparer<T>.Default.Equals(input, default(T))
            ? DBNull.Value : (object) input;
    }
    

    这会将0'\0'falsenull 等转换为DBNull.Value。不过,你必须非常小心地使用它,因为我认为有很多地方 0 应该是 0。

    【讨论】:

      【解决方案3】:

      如果您经常这样做,请尝试将检查放入方法中。

      例如:

      // ...
      SetFormattedValue(ref cmd, node.ID);
      // ...
      
      private void SetFormattedValue(ref IDBCommand cmd, int id) // IDBCommand - or whatever your command type is
      {
          if(node.ID==0)
          {
              cmd.Parameters["@ID"].Value = DBNull.Value;
          }
          else
          {
              cmd.Parameters["@ID"].Value = node.ID;
          }
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用?? 运算符:

        cmd.Parameters["@ID"].Value = node.ID ?? (object)DBNull.Value
        

        【讨论】:

          猜你喜欢
          • 2019-05-08
          • 1970-01-01
          • 2020-04-05
          • 1970-01-01
          • 2015-04-07
          • 1970-01-01
          • 2021-02-19
          • 2013-01-04
          • 1970-01-01
          相关资源
          最近更新 更多