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