【问题标题】:Update 1 row using primary key使用主键更新 1 行
【发布时间】:2018-05-16 08:16:31
【问题描述】:

我在 form1 中有一个 datagridview,用户选择一行并将相关详细信息发送到 form2 中的相关文本框。从这里用户单击一个按钮,该按钮应更新所选行中的单元格(在数据库中)并将其更改为“生产中”(这是 orderstatus 文本框。

我希望能够更新与客户 ID 相关的行,客户 ID 是数据库中的主键...目前软件会更新数据库表中的所有内容...

MAcon.Open();
OleDbCommand cm = new OleDbCommand("UPDATE [Customer Orders] SET [Order Status]=@OrderStatus WHERE [CustomerID]=@CustomerID", MAcon);
cm.Parameters.AddWithValue("@OrderStatus", textBox4.Text);
cm.Parameters.AddWithValue("@CustomerID", CustID.Text);
cm.ExecuteNonQuery();
MAcon.Close();

【问题讨论】:

  • 更新数据库表中的所有内容是什么意思?不止一排?或者您的 SET 语句中未列出的列?如果您使用正确的变量值将该查询复制/粘贴到管理工作室中,您会得到预期的结果吗?如果没有,具体发生了什么您没有预料到的事情?
  • 更新不止一行
  • 数据库表的完整结构是什么?它是什么类型的数据库?表中有多少条记录?记录样本是什么样的?
  • 如果更新超过 1 行,那么您的 CustomerId 字段不是唯一的。并且不能是您的主键。至少不是自己。该表是否只有一个自动递增的标识字段,可能是“Id”。
  • 如果您将 customerid 硬编码到查询中会发生什么。它会产生同样的问题吗?您确定没有其他代码可以在没有 WHERE 子句的情况下进行测试吗?

标签: c#


【解决方案1】:

正如其他人所指出的,如果不至少对 Customer Orders 表进行某种定义,很难真正了解问题。

根据您提供给我们的信息进行有根据的猜测,我在这里假设 Customer Orders 上的 customerID 字段是一个整数。

我想说,这个问题是由 .AddWithValue() 中继承的隐含类型转换引起的。 CustID.Text 将返回一个字符串,因此更新语句中的 where 子句会将整数值与永远不相等的字符串进行比较。

如果您将代码更改为:

cm.Parameters.Add("@OrderStatus", SqlDbType.VarChar).Value = textBox4.Text;
cm.Parameters.Add("@CustomerID", SqlDbType.Int32).Value = textBox4.Text

这只是我的想法,所以语法和类型可能有点偏离

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2019-04-23
    • 2019-12-16
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多