【问题标题】:DBNull.Value as optional parameterDBNull.Value 作为可选参数
【发布时间】:2012-03-09 09:22:20
【问题描述】:

是否可以将 DBNull.Value 作为可选参数传递? 我在 C# 中尝试过

private void CallSP(string param0, string param2 = DBNull.Value)
{
}

它给出错误。我需要在这个方法中调用一个存储过程,所以我要传递 DBNull.Value。 'DBNull.Value' 和 'null' 在 SQL Server 中是否被视为相同?我应该通过'null'而不是'DBNull.Value'吗???

【问题讨论】:

  • @1ntello "never use null" 是相反的——绝对没有理由不使用null,而且它与 SQL 中的 null 并没有非常不同——只有零相等是不同的,这很容易保持一致。
  • 也许还可以看到:stackoverflow.com/a/9632050/23354

标签: c# null optional


【解决方案1】:

DBNull.Value 不是字符串,并且不是常量(可选参数值必须是常量)。这样做的方法是将其默认为常规null,并在添加参数时处理null

private void CallSP(string param0, string param2 = null)
{
    ...
    object value = (object)param2 ?? DBNull.Value;
    // ^^^ use value in the parameter
    ...
}

【讨论】:

  • +1,只是为了明确说明 OP,因为它经常让人绊倒 - 将参数值设置为 null 将导致该参数不被传递,并且最终会出现 SqlException。 null != DBNull.Value
  • @AdaTheDev 就我个人而言,我还没有找到一个 令人信服的理由来证明DBNull存在。我见过很多论点——没有一个非常有说服力。
  • @MarcGravell - 完全同意
  • @MarcGravell 没关系。就我个人而言,我永远看不到任何使 varchar 字段可以为空的令人信服的理由。但是在某个地方的某个人可能会认为这样的东西很有用!
  • @AdaTheDev 你可能会觉得这很有趣:stackoverflow.com/a/9632050/23354
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 2014-08-05
  • 2012-05-22
  • 2015-08-12
相关资源
最近更新 更多