我有一个值,我试图将其作为参数添加到存储过程。
此参数的值可以是STRING“1”或“NULL”
如果它为NULL,那么我想添加DBNull.Value
如果它是“1”我想添加参数1(int)
我尝试过多种语法组合但无法正确使用。
这就是我所拥有的:
cmd.Parameters.Add(new SqlParameter("@LinkClickedId", (insertValuesSplit[12] == "NULL") ? Convert.ToInt16(insertValuesSplit[12]) : DBNull.Value));
但我的语法错误为
无法确定条件表达式的类型,因为'short'和'System.DBNull'之间没有隐式转换 任何人都可以建议语法应该是什么?
答案 0 :(得分:1)
尝试将其投射到对象:
(object) Convert.ToInt16(insertValuesSplit[12])
问题在于,您的三元运算符没有可以在Convert.ToInt16(insertValuesSplit[12])
和DBNull.Value
之间识别的常见类型,但是如果您将值转换为object
,那么它的工作原理是因为那里 是DBNull.Value
和object
之间的隐式转换。
答案 1 :(得分:1)
(insertValuesSplit[12] == "NULL") ? Convert.ToInt16(insertValuesSplit[12]) : DBNull.Value)
短手if语句必须返回相同的类型。
Convert.ToInt16(insertValuesSplit[12])
返回short
DBNull.Value
会返回Object
答案 2 :(得分:0)
三元运算符是一个表达式,因此它有一个类型。编译器尝试确定此类型但是失败,因为您的真实案例是short
,但您的错误案例是DBNull
。
您必须明确地将其中一个投射到object
才能使其正常工作,例如
(object) Convert.ToInt16(insertValuesSplit[12])
。
答案 3 :(得分:0)
条件运算符的true和false子表达式具有DbNull和Int16类型。
您可能需要将结果转换为唯一的基本类型:object
。
PS。我认为你的情况已经逆转:如果你想要{NULL}而不是解析。