Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlParameterCollection只接受非null的SqlParameter类型对象,而不接受DBNull对象_C#_Sql_Ado.net_Sqlparameter - Fatal编程技术网

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

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

当我将SQL参数
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帮助我:)