看来我需要帮助来弄清楚这个本来应该是一个简单的问题。我正在更新一些现有代码,并且有一个具有可为空参数并更新表的存储过程。
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;
}
当我运行此代码且上述 if 条件不满足时,字段值将保持原样 (NULL
),如果满足,则字段值将更新为 1
。知道为什么在不满足条件时它们不更新为 0 吗?
最佳答案
这一行
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 });
关于c# - SqlParameter 不存储错误的 BIT 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25745515/