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

时间:2012-11-30 21:38:30

标签: 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);  

2 个答案:

答案 0 :(得分:14)

您没有添加new SqlParameterpnew SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) 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是参数,而不是参数的值。

答案 1 :(得分:-2)

您需要使用:

System.Data.SqlTypes.SqlInt32.Null