使用三元运算符填充SqlCommand参数

时间:2017-07-20 13:30:24

标签: c# ternary-operator

我需要填充SqlCommand中的参数,但在某些条件下,我想用DBNull.Value填充它,否则用值填充。

我需要的是,当变量truckID == -1然后将DBNull.Value放入参数时,否则将truckID的值放入其中。

这就是我的尝试:

using (SqlCommand command = new SqlCommand(sql.ToString()))
{
   command.CommandType = CommandType.Text;
   command.Parameters.AddWithValue("@TruckID", truckID == -1 ? DBNull.Value : truckID);

但是编译器告诉我:

  

错误CS0173无法确定条件表达式的类型,因为'System.DBNull'和'int'之间没有隐式转换

如果我写这个:

command.Parameters.AddWithValue("@TruckID", truckID == -1 ? 0 : truckID);

然后编译器很高兴。所以对于三元运算符来说,似乎两个可能的值必须是相同的类型。

最好的方法是什么?

编辑:

我的工作代码是:

command.Parameters.Add
    (new SqlParameter("@TruckID", SqlDbType.Int).Value = (import.TruckID == -1) ? (object)DBNull.Value : import.TruckID);

修改
实际上上面的代码毕竟不起作用 在运行时我得到了这个:

  

SqlParameterCollection只接受非null的SqlParameter类型   对象,而不是DBNull对象

所以我将代码修改为此,这最终对我有用。

command.Parameters.Add
    (new SqlParameter("@PlaceID", SqlDbType.Int) { Value = (import.TruckID == -1) ? (object)DBNull.Value : import.TruckID });

2 个答案:

答案 0 :(得分:2)

您可以尝试这样

SqlParameter param = new SqlParameter("@truckID", System.Data.SqlDbType.Int);
param.Value = (truckID == -1) ? DBNull.Value : truckID;
command.Parameters.Add(param);

一个班轮版本就是

SqlParameter param = new SqlParameter("@truckID", System.Data.SqlDbType.Int) 
                          { Value = (truckID == -1) ? (object)DBNull.Value : truckID };
command.Parameters.Add(param);

另一个版本:

SqlParameter param = (truckID == -1) ? 
                       new SqlParameter("@truckID", System.Data.SqlDbType.Int) { Value = DBNull.Value } 
                      : new SqlParameter("@truckID", System.Data.SqlDbType.Int) { Value = truckID };
command.Parameters.Add(param);

答案 1 :(得分:1)

您可以明确地将DBNull.Value投射到对象:

command.Parameters.AddWithValue("@TruckID", truckID == -1 ? (object)DBNull.Value : truckID);