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

C# 使用三元运算符填充SqlCommand参数,c#,ternary-operator,C#,Ternary Operator,我需要在SqlCommand中填充一个参数,但在某些情况下,我希望用DBNull.Value或其他值填充它 我需要的是,当变量truckID==-1时,将DBNull.Value放入参数中,否则将truckID的值放入其中 这就是我尝试过的: using (SqlCommand command = new SqlCommand(sql.ToString())) { command.CommandType = CommandType.Text; command.Parameters.A

我需要在
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 });

您可以显式地将
DBNull.Value
强制转换为对象:

command.Parameters.AddWithValue("@TruckID", truckID == -1 ? (object)DBNull.Value : truckID);
你可以这样试试

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);

常规的ol'
if
语句在这里是个坏主意吗?它们必须是相同的类型或隐式转换(IIRC)。只需将其拆分为实际的if语句。
truckId==-1?(object)DBNull.value:truckID
。不要使用。@JeroenMostert为什么AddWithValue不好用?单击链接。是的,但我想将它保留在一行代码中确定这就是我需要的。谢谢,我只是将第一行作为参数的参数。add()@GuidoG完成了这项工作吗?它应该有相同的问题,你原来有和另外一个线性版本看起来非常奇怪我。这不应该编译。它应该是这样的:`SqlParameter param=newsqlparameter(@truckID),System.Data.SqlDbType.Int){Value=(truckID=-1)?(object)DBNull.Value:truckID}@RomanoZumbé是的,我不得不对代码进行一些修改,使其能够编译,但这个想法确实奏效。我刚刚编辑了这个问题,把正在工作的一行放在了最后bottom@RomanoZumb代码毕竟在运行时不起作用。检查我问题中的最后一次编辑我再次更改了代码,现在它真的起作用了