似乎我需要帮助深入了解应该是一个简单的问题。我正在更新一些现有代码,并且我有一个存储过程,它具有可为空的参数并更新表。
示例SP参数
,@Paid bit = NULL
,@Despatched bit = NULL
SP代码示例
,Paid = ISNULL(@Paid, Paid)
,Despatched = ISNULL(@Despatched, Despatched)
,MarkedAsPaid = ISNULL(@MarkedAsPaid, MarkedAsPaid)
,MarkedAsDespatched = ISNULL(@MarkedAsDespatched, MarkedAsDespatched)
C#代码
cmd.Parameters.Add(new SqlParameter("@Despatched", 0));
cmd.Parameters.Add(new SqlParameter("@Paid", 0));
if (request.ShippedDate != null && request.ShippedDate != DateTime.MinValue.ToString())
{
cmd.Parameters["@Despatched"].Value = 1;
}
if (request.PaymentMethod == "PayPal" && request.CheckOutStatus == "NoPaymentFailure")
{
cmd.Parameters["@Paid"].Value = 1;
}
当我运行此代码时,如果不满足条件,则上述字段值保持不变(NULL
)如果满足,则字段更新为1
。知道为什么在条件不满足时他们没有更新到0?
答案 0 :(得分:3)
这一行
cmd.Parameters.Add(new SqlParameter("@Despatched", 0));
并不意味着传递的值为0
,而是,而是代表SqlDbType
枚举值。。 (BigInt
)。自0
is implicitly convertible to any enum type起,您就看不到错误。
添加如下参数:
cmd.Parameters.Add(new SqlParameter("@Despatched",SqlDbType.Bit));
然后添加一个else语句,如:
if (request.ShippedDate != null && request.ShippedDate != DateTime.MinValue.ToString())
{
cmd.Parameters["@Despatched"].Value = 1;
}
else
{
cmd.Parameters["@Despatched"].Value = 0;
}
或者您可以保留当前代码并添加默认值,如:
cmd.Parameters.Add(new SqlParameter("@Despatched",SqlDbType.Bit){ Value = 0 });