c# - SqlParameter 不存储错误的 BIT 值

标签 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;
   }

当我运行此代码且上述 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/

相关文章:

c# - 获取 DIV 内的链接

c# - 获取一个类型的所有派生类型

c# - 交易陷入僵局

sql - 动态 sql 与存储过程 - 优缺点?

sql-server - SQL Azure 中 1 个特定存储过程的随机超时

sql - SQL中查找保留关键字

c# - 如何通过 Windows Mobile 6 使用存储管理器 API 格式化 SD 卡

c# - 使用循环添加标签名称的紧凑方法

sql-server - 在没有网络连接的情况下在 SQL 数据库之间传输表的最简单方法是什么?

sql-server - 如何在检查约束中引用其他表?