代码之家  ›  专栏  ›  技术社区  ›  Stewart Johnson

C#ADO.NET:nulls和DbNull-有更有效的语法吗?

  •  48
  • Stewart Johnson  · 技术社区  · 16 年前

    我有一本书 DateTime? 我试图使用 DbParameter . 我这样创建参数:

    DbParameter datePrm = updateStmt.CreateParameter();
    datePrm.ParameterName = "@change_date";
    

    然后我想把 约会时间? 进入 dataPrm.Value 而会计 null

    起初我以为我会很聪明:

    datePrm.Value = nullableDate ?? DBNull.Value;
    

    运算符“??”不能应用于“System.DateTime”和“System.DBNull”类型的操作数

    所以我想只有当第二个参数是第一个参数的不可空版本时,这才有效。于是我选择了:

    datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value;
    

    但这也不起作用:

    但我不想在这些类型之间转换!

    到目前为止,我唯一能去工作的是:

    if (nullableDate.HasValue)
      datePrm.Value = nullableDate.Value;
    else
      datePrm.Value = DBNull.Value;
    

    这真的是我写这篇文章的唯一方法吗?有没有一种方法可以使用三元运算符得到一个线性函数?

    这个运算符返回左操作数(如果不为null),否则返回右操作数。

    这正是我想要的!

    更新2:

    datePrm.Value = nullableDate ?? (object)DBNull.Value;
    
    6 回复  |  直到 15 年前
        1
  •  64
  •   Stewart Johnson    16 年前

    啊哈!我找到了一个比@Trebz更有效的解决方案!

    datePrm.Value = nullableDate ?? (object)DBNull.Value;
    
        2
  •  6
  •   Gian Marco    10 年前

    System.Data.SqlTypes 命名空间包含一些实用程序类,可以避免烦人的类型转换。例如,与此相反:

    var val = (object) "abc" ?? DBNull.Value;
    

    你可以这样写:

    var val = "abc" ?? SqlString.Null;
    
        3
  •  5
  •   dnolan    16 年前

    如果你使用

    datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : DBNull.Value;
    
        4
  •  5
  •   Pop Catalin    16 年前

    public static class DBNullableExtensions
    {
        public static object ToDBValue<T>(this Nullable<T> value) where T:struct
        { 
            return value.HasValue ? (object)value.Value : DBNull.Value;
        }
    }
    
    
    class Program
    {
        static void Main(string[] args)
        {
            int? x = null;
    
            Console.WriteLine(  x.ToDBValue() == DBNull.Value );
        }
    }
    
        5
  •  1
  •   Dan    16 年前

    我认为您第二次尝试时出现的错误是由于nullableDate.Value和DBNull.Value是不同的类型,三元运算符在这两种情况下都需要选择一种类型来返回。我没有环境来测试这一点,但我认为这应该适合您:

    datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : (object)DBNull.Value;
    
        6
  •  0
  •   Darren Kopp    16 年前