繁体   English   中英

SQL更新不适用于主键

[英]SQL Update not working for primary key

我写了一条声明来更新细节属于主键(Mobile)。 但它仅适用于其他列。 当我更新手机号码时。 它没有改变。

这是我的查询

private void button4_Click(object sender, EventArgs e)
{
    con.Open();

    SqlCommand cmd = new SqlCommand(@"UPDATE [dbo].[Table]
SET [First] = '"+textBox1.Text+"',[Last] = '"+textBox2.Text+ "' ,[Mobile] = '" +textBox3.Text+ "'    ,[Email] = '" +textBox4.Text+ "' ,[Category] = '" + comboBox1.Text + "' WHERE (Mobile='" + textBox3.Text + "')", con);

    cmd.ExecuteNonQuery();

    con.Close();
    MessageBox.Show("Updated Successfully");
    display();
}

以下几列可以更新

First,
Last,
Email,
Category

但无法更新“ Mobile列。

CREATE TABLE [dbo].[Table]
(
    [First] VARCHAR(50) NOT NULL , 
    [Last] VARCHAR(50) NOT NULL, 
    [Mobile] VARCHAR(50) NOT NULL, 
    [Email] VARCHAR(50) NOT NULL, 
    [Category] VARCHAR(50) NOT NULL, 

    CONSTRAINT [PK_Table] PRIMARY KEY ([Mobile])
)

有人可以告诉我错误吗?

由于where子句,因此您对[mobile]的更新没有任何意义。 它指出:“更新所有这些东西,包括移动设备在哪里,移动设备就是这个值。在两种情况下,您都使用textbox3.Text,所以它永远不会更新,因为它是相同的值。

例如

update foo set mobile = 'abc' where mobile = 'abc'

在给出该查询的情况下,mobile绝不会是'abc'以外的任何内容。

如果要解决此问题,则需要实际设计表格。 有一个单独的主键:

PersonId int identity primary key  

那么您可以执行以下操作:

update Person set mobile = 'abc' where PersonId = 1  

并将PersonId存储在用户无需查看的地方。
如果您要通过Mobile大量查询该表,则可以考虑在Mobile列上添加一个二级索引,如果您需要唯一的话,还要添加一个唯一约束。

另外,一般情况下,请通读WinForm DataBinding,以便以后解决问题。 BindingContext是需要理解的重要类,但需要花费一些时间。 您稍后将在SPADES中使此时间回到,因此请继续阅读。

您想要更新主键而不是插入新记录有点奇怪。 无论如何,请检查以下有关禁用约束实施的答案:

https://stackoverflow.com/a/2499328/1821637

为了更新手机号码,您需要添加一个附加的文本框,或者提供旧的手机号码。

如果您使用的是WPF或Windows表单,那么我将为旧手机号码添加一个新的表单字段,并将该字段传递给您的where子句。 只要原来的手机号码完全匹配,此功能就可以使用。 假设您正在执行varchar(50),则对于以不同方式输入数据的人,例如(555)555-5555与555.555.5555,可能会出错。

如前所述,将字段更新为您执行搜索时使用的值没有任何意义。 另外,您永远不要编写这样的SQL语句,而应使用参数:

private void button4_Click(object sender, EventArgs e)
{


SqlCommand cmd = new SqlCommand(@"UPDATE [dbo].[Table] SET 
      [First] = @first,
      [Last] = @last, 
      [Email] = @email,
      [Category] = @cat
  WHERE (Mobile=@mobile)", con);

cmd.Parameters.Add("@first", SqlDbType.VarChar).Value = textBox1.Text;
cmd.Parameters.Add("@last", SqlDbType.VarChar).Value = textBox2.Text;
cmd.Parameters.Add("@email", SqlDbType.VarChar).Value = textBox4.Text;
cmd.Parameters.Add("@cat", SqlDbType.VarChar).Value = comboBox1.Text;
cmd.Parameters.Add("@mobile", SqlDbType.VarChar).Value = textBox3.Text;

con.Open();
cmd.ExecuteNonQuery();
con.Close();

MessageBox.Show("Updated Successfully");
display();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM