9

我正在使用存储过程在 sql db 中创建/更新记录。我从我的 C# 数据访问层提供了大约 30 个参数。sql 表除了其主键列之外,所有列都可以为空。在这里,当我向可空列提供空值时,它会引发“过程或函数'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();

可以清楚地看到,添加了参数并将空值提供给可以为空的列,但它仍然产生异常。任何人的帮助将不胜感激。

亲切的问候

4

3 回答 3

21

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;
}
于 2013-09-12T08:51:27.157 回答
7

这是一个非常烦人的问题,最近让我失望了,因为我已经很长时间没有遇到它了。

我决定在我的 RepositoryBase 类中添加它

    protected object ValueOrNull(object value)
    {
        return value ?? DBNull.Value;
    }

这在我的任何可选项目的实际回购代码中

cmd.Parameters.Add(new SqlParameter("@VoucherCode", SqlDbType.VarChar)).Value = ValueOrNull(promo.VoucherCode);
于 2016-04-14T09:25:14.513 回答
1

你应该尝试

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

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

于 2013-09-12T09:10:41.923 回答