Lea*_*rve 8 c# sql stored-procedures
我正在使用存储过程在sql db中创建/更新记录.我从C#数据访问层提供了大约30个参数.sql表具有除其主键列之外的所有列null.这里当我向null able列提供一个空值时,它抛出了一个异常"过程或函数"spFullUpdate'期望参数'@ App1TAPAYears',这是未提供的." 在我的c#代码中,我可以清楚地看到该列提供了一个空值.可以请任何人告诉我如何纠正这个问题.以下是我的代码段.设置数据对象的值如下
Dt.TimeAtPreviousAddressYears = int.TryParse(TimeatPreviousAddressYears.Text, out intOut) ? intOut : (int?)null;
Run Code Online (Sandbox Code Playgroud)
以下是我的实体类中的可空属性
public int? TimeAtPreviousAddressYears { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的数据访问层添加参数代码如下
cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value = dataObject.TimeAtPreviousAddressYears;
SqlDataAdapter da = new SqlDataAdapter(cmd);
conn.Open();
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
可以清楚地看到,添加了参数并将空值提供给nullable列,但它仍然产生异常.任何人的帮助将非常感激.
亲切的Regardds
Hes*_*her 18
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;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
这是一个非常烦人的问题,最近让我失望了,因为我已经很长时间没有碰到它了。
我决定将其添加到我的RepositoryBase类中
protected object ValueOrNull(object value)
{
return value ?? DBNull.Value;
}
Run Code Online (Sandbox Code Playgroud)
这是我实际回购代码中所有可选项目的代码
cmd.Parameters.Add(new SqlParameter("@VoucherCode", SqlDbType.VarChar)).Value = ValueOrNull(promo.VoucherCode);
Run Code Online (Sandbox Code Playgroud)