【问题标题】:SqlParameterCollection only accepts non-null SqlParameter type objects, not DBNull objectsSqlParameterCollection 只接受非空 SqlParameter 类型对象,不接受 DBNull 对象
【发布时间】:2012-11-19 03:59:44
【问题描述】:

当我将 SQL 参数 p 添加到集合中时,我会得到一个 InvalidCastException,其中包含来自帖子标题的消息。

parentId 是可空整数,在数据库中是可空整数。

为什么会出现此异常以及如何解决?

我不使用存储过程,并且我已经阅读了类似的主题,但它们对我没有帮助。

var p = new SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) DBNull.Value;
cmd.Parameters.Add(p);  

【问题讨论】:

  • 不知道为什么这会被否决。这是一个写得很好的问题,其代码可以重现该问题。
  • @感谢 vcsjones 帮助我 :)

标签: c# sql ado.net sqlparameter


【解决方案1】:

你需要使用:

System.Data.SqlTypes.SqlInt32.Null

【讨论】:

    【解决方案2】:

    您没有添加您的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 是参数,而不是参数的值。

    【讨论】:

    • 或者你可以只使用括号:var p = new SqlParameter("ParentId", SqlDbType.Int).Value = (parentId ?? (object) DBNull)
    • @phoog 这意味着同样的事情(好吧,如果你在DBNull 之后添加.Value),所以仍然行不通。
    • 哦,是的,我明白了。一定是星期五下午。
    • 哦,是的,感谢这里周五午夜也发生的“var”关键字...我会使用不会发生的 SqlParameter。
    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多