C# 将空参数插入十进制可为空的列

C# 将空参数插入十进制可为空的列,c#,sql-server,C#,Sql Server,我没有可插入MaxPrice或MinPrice列的值,这些列可以为null。不存在时的值最初在结果Sql表达式中被视为。我之前遇到语法错误,并将代码更改为 (setItem.MinPrice.ToString()!="")?setItem.MinPrice.ToString() : null, (setItem.MaxPrice.ToString() != "") ? setItem.MaxPrice.ToString() : null 但是当我执行这个命令时,我得到了一个错误,sql看起

我没有可插入MaxPrice或MinPrice列的值,这些列可以为null。不存在时的值最初在结果Sql表达式中被视为。我之前遇到语法错误,并将代码更改为

 (setItem.MinPrice.ToString()!="")?setItem.MinPrice.ToString() : null,
 (setItem.MaxPrice.ToString() != "") ? setItem.MaxPrice.ToString() : null

但是当我执行这个命令时,我得到了一个错误,sql看起来仍然像。列是十进制的,但可以为空

使用参数。总是

cmd.Parameters.AddWithValue("@minPrice",
    setItem.MinPrice == null ? DBNull.Value : (object)setItem.MinPrice);
cmd.Parameters.AddWithValue("@maxPrice",
    setItem.MaxPrice == null ? DBNull.Value : (object)setItem.MaxPrice);
或者使用像Dapper这样的工具:

// adds "@MinPrice" and "@MaxPrice" correctly as parameters, as long
// as the sql contains those tokens in some way
conn.Execute(sql, new { setItem.MinPrice, setItem.MaxPrice });
错误的修复-不要使用-将在串联中提供文本
“null”
。有很多理由不这样做:

// bad code; do not use
(setItem.MinPrice.ToString() != "") ? setItem.MinPrice.ToString() : "null",
(setItem.MaxPrice.ToString() != "") ? setItem.MaxPrice.ToString() : "null"

您正在执行字符串连接以构建SQL,并且
null
不会向字符串添加任何内容。相反,您应该使用参数并为参数值传递
null
。您的代码存在许多问题,因此不应为此使用字符串连接。您也可以使用
“null”
而不是
null
,但使用参数绝对是正确的方法。不使用字符串表达式的另一个原因是
.ToString()
对于使用逗号作为小数分隔符的区域性来说,这不是一个好的解决方案,但这真的只是锦上添花。@LasseVågsætherKarlsen是的,是众多解决方案中的一个——我几乎添加了一个不变的修复,但是。。。我真的不想开始讨论这些,真的。有太多的理由不这么做-似乎很难选择最喜欢的:)