过程或函数需要参数,但未提供.引发异常的可为空列
本文关键字:异常 函数 参数 过程 | 更新日期: 2023-09-27 18:30:58
我正在使用存储过程在sql db中创建/更新记录。我从 C# 数据访问层提供了大约 30 个参数。SQL 表具有除主键列之外的所有可为 null 的列。在这里,当我向可空列提供空值时,它会抛出"过程或函数'spFullUpdate'期望参数'@App1TAPAYears',但未提供"的异常。在我的 c# 代码中,我可以清楚地看到该列提供了空值。任何人都可以告诉我如何纠正这个问题。以下是我的代码片段。数据对象的设置值如下
Dt.TimeAtPreviousAddressYears = int.TryParse(TimeatPreviousAddressYears.Text, out intOut) ? intOut : (int?)null;
以下是我的实体类中的可为空属性
public int? TimeAtPreviousAddressYears { get; set; }
我的数据访问层添加参数代码如下
cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value = dataObject.TimeAtPreviousAddressYears;
SqlDataAdapter da = new SqlDataAdapter(cmd);
conn.Open();
cmd.ExecuteNonQuery();
可以清楚地看到,添加了参数并将 null 值提供给可空列,但它仍然产生异常。任何人的帮助都将不胜感激。
亲切的问候
nullable != 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 = DBNull.Value;
}
这是一个非常烦人的问题,最近让我失望了,因为我很久没有遇到它了。
我决定在我的存储库基类中添加它
protected object ValueOrNull(object value)
{
return value ?? DBNull.Value;
}
这是我在任何可选项目的实际存储库代码中
cmd.Parameters.Add(new SqlParameter("@VoucherCode", SqlDbType.VarChar)).Value = ValueOrNull(promo.VoucherCode);
你应该
尝试使用
if (dataObject.TimeAtPreviousAddressYears.HasValue)
{
cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value =dataObject.TimeAtPreviousAddressYears;
}else
{
cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value = (object)DBNull.Value;
}
问题是(如错误消息所示)条件表达式在两个分支上需要相同的类型。