Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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# 过程或函数需要未提供的参数。引发异常的可为null的列_C#_Sql_Stored Procedures - Fatal编程技术网

C# 过程或函数需要未提供的参数。引发异常的可为null的列

C# 过程或函数需要未提供的参数。引发异常的可为null的列,c#,sql,stored-procedures,C#,Sql,Stored Procedures,我正在使用存储过程在sql db中创建/更新记录。我从我的C#数据访问层提供了大约30个参数。sql表除了主键列之外,所有列都可以为null。在这里,当我向一个可为null的列提供null值时,它抛出了一个异常“过程或函数'spFullUpdate'期望参数'@App1TAPAYears',但未提供该参数。”。在我的c#代码中,我可以清楚地看到该列提供了一个空值。请任何人告诉我如何纠正这个问题。 下面是我的代码片段。 数据对象的设置值如下所示 Dt.TimeAtPreviousAddressYe

我正在使用存储过程在sql db中创建/更新记录。我从我的C#数据访问层提供了大约30个参数。sql表除了主键列之外,所有列都可以为null。在这里,当我向一个可为null的列提供null值时,它抛出了一个异常“过程或函数'spFullUpdate'期望参数'@App1TAPAYears',但未提供该参数。”。在我的c#代码中,我可以清楚地看到该列提供了一个空值。请任何人告诉我如何纠正这个问题。 下面是我的代码片段。 数据对象的设置值如下所示

Dt.TimeAtPreviousAddressYears = int.TryParse(TimeatPreviousAddressYears.Text, out intOut) ? intOut : (int?)null;
cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value = dataObject.TimeAtPreviousAddressYears;
SqlDataAdapter da = new SqlDataAdapter(cmd);
                conn.Open();
                cmd.ExecuteNonQuery();
以下是我的实体类中的可空属性

        public int? TimeAtPreviousAddressYears { get; set; }
我的数据访问层添加参数代码如下

Dt.TimeAtPreviousAddressYears = int.TryParse(TimeatPreviousAddressYears.Text, out intOut) ? intOut : (int?)null;
cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value = dataObject.TimeAtPreviousAddressYears;
SqlDataAdapter da = new SqlDataAdapter(cmd);
                conn.Open();
                cmd.ExecuteNonQuery();
可以清楚地看到,添加了参数,并将null值提供给一个可为null的列,但它仍然产生异常。任何人的帮助都将受到感激


种类Regardds

可为空!=DBNull.Value

因此,您不能将
(int?)null传递给参数值,而是传递
DBNull.value

比如:

你应该试试看

if (dataObject.TimeAtPreviousAddressYears.HasValue) 
{ 
    cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value =dataObject.TimeAtPreviousAddressYears;
}else
{
    cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value = (object)DBNull.Value;
}

问题是(如错误消息所示),条件表达式在两个分支上都需要相同的类型。

这是一个非常恼人的问题,最近我被甩了,因为我很久没有遇到它了

我决定把它添加到我的RepositoryBase类中

    protected object ValueOrNull(object value)
    {
        return value ?? DBNull.Value;
    }
在我的实际回购代码中,这是任何可选项目的代码

cmd.Parameters.Add(new SqlParameter("@VoucherCode", SqlDbType.VarChar)).Value = ValueOrNull(promo.VoucherCode);

请显示在执行SP之前添加所有参数的代码。(编辑您的帖子)代码很好,因为在我为该参数提供值时不会产生异常。只有当值为null时才会引发异常。我只是想确定一下。我已经了解了许多关于未提供参数的问题,这些问题是在查询之前再次创建命令对象引起的。在我的例子中,命令参数创建成功。问题在于空值。在命令参数列表中,@App1TAPAYears的IsNullable属性设置为false,值为“null”。我收到一个错误“无法确定条件表达式的类型,因为“int”和“System.DBNull”之间没有隐式转换,因此此
短路
或此赋值的命名方式在这种情况下不起作用,因此您需要如果没有,请使用经典。更新了我的答案。非常感谢。现在一切正常。非常感谢您的帮助。这解决了我的问题,但只是因为在我的存储过程中,我使用了
@paramname int NULL
而不是
@paramname int=NULL
d'ohh。使用等号,您可以整天从C#传入
null
。或者使用稍多的标记但没有额外的方法:
cmd.Parameters.Add(新的SqlParameter(@VoucherCode),SqlDbType.VarChar))。Value=(object)Value??DBNull.Value