SqlParameter不存储false BIT值

时间:2014-09-09 13:09:18

标签: c# sql-server stored-procedures

似乎我需要帮助深入了解应该是一个简单的问题。我正在更新一些现有代码,并且我有一个存储过程,它具有可为空的参数并更新表。

示例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?

1 个答案:

答案 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 });