C# SqlParameterCollection只接受非null的SqlParameter类型对象,而不接受DBNull对象
当我将SQL参数C# SqlParameterCollection只接受非null的SqlParameter类型对象,而不接受DBNull对象,c#,sql,ado.net,sqlparameter,C#,Sql,Ado.net,Sqlparameter,当我将SQL参数p添加到集合中时,我会得到一个InvalidCastException,其中包含来自文章标题的消息 parentId是数据库中可为空的整数和可为空的整数 为什么会出现此异常,如何解决 我不使用存储过程,我读过类似的线程,但它们对我没有帮助 var p = new SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) DBNull.Value; cmd.Parameters.Add(p); 您
p
添加到集合中时,我会得到一个InvalidCastException
,其中包含来自文章标题的消息
parentId
是数据库中可为空的整数和可为空的整数
为什么会出现此异常,如何解决
我不使用存储过程,我读过类似的线程,但它们对我没有帮助
var p = new SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) DBNull.Value;
cmd.Parameters.Add(p);
您没有添加
新的SqlParameter
p
是新SqlParameter(“ParentId”,SqlDbType.Int)的结果。Value=ParentId??(对象)DBNull.Value。换句话说,p
本身就是DBNull.Value
将语句一分为二,如下所示:
var p = new SqlParameter("ParentId", SqlDbType.Int);
p.Value = parentId ?? (object) DBNull.Value;
cmd.Parameters.Add(p);
或者
var p = new SqlParameter("ParentId", SqlDbType.Int) { Value = parentId ?? (object) DBNull.Value };
cmd.Parameters.Add(p);
这两种方法都将确保p
是参数,而不是参数的值。您需要使用:
System.Data.SqlTypes.SqlInt32.Null
或者你可以用括号:
var p=new-SqlParameter(“ParentId”,SqlDbType.Int)。Value=(ParentId???(object)DBNull)
@phoog这意味着同样的事情(如果你在DBNull
之后添加.Value
),所以仍然不起作用。哦,是的,我明白了。一定是星期五下午。哦,是的,感谢“var”关键字,也发生在星期五午夜这里。。。我会使用不会发生的SqlParameter。不知道为什么会被否决。这是一个写得很好的问题,代码重现了这个问题。@感谢vcsjones帮助我:)