C# SQL更新不适用于主键

C# SQL更新不适用于主键,c#,sql-server,C#,Sql Server,我写了一个声明,用于更新属于主键(移动)的详细信息。但它只适用于其他列。当我更新手机号码时。它不会改变 这是我的问题 private void button4_Click(object sender, EventArgs e) { con.Open(); SqlCommand cmd = new SqlCommand(@"UPDATE [dbo].[Table] SET [First] = '"+textBox1.Text+"',[Last] = '"+textBox2.Tex

我写了一个声明,用于更新属于主键(移动)的详细信息。但它只适用于其他列。当我更新手机号码时。它不会改变

这是我的问题

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,所以它永远不会更新,因为它是相同的值

e、 g

考虑到这个问题,手机永远不会是“abc”之外的任何东西

如果要解决此问题,需要正确设计表。请使用单独的主键:

PersonId int identity primary key  
然后你可以做:

update Person set mobile = 'abc' where PersonId = 1  
并将PersonId存储在用户不必查看的地方。
如果你想通过移动台查询表,那么考虑在移动栏上添加一个辅助索引,如果你需要它是唯一的,那么添加一个唯一的约束。
另外,请通读WinForm数据绑定,因为这样做会在以后给您带来问题。BindingContext是一个需要理解的重要类,但这需要一些时间。稍后您会将这段时间平分秋色地赶回来,所以一定要继续阅读。

您想更新主数据绑定,这有点奇怪键,而不是插入新记录。无论如何,请检查有关禁用约束强制的回答:


要更新手机号码,您需要添加一个额外的文本框或以其他方式提供旧的手机号码


如果您使用的是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();
}

您可以共享表定义吗?可能表上有一个触发器阻止更新字段,或者您的数据库具有列级权限。我添加了表定义移动列上有外键吗?如果有,外键的更新规则是什么?-您不应该将SQL语句串联在一起-使用parametrized查询相反,为了避免SQL注入-签出@user3398379,您只需从更新的字段集中删除移动设备,更重要的是,使用这种类型的字符串连接并使用参数就可以删除移动设备。通过这种方式得到错误是您的运气。什么“不”仍然不起作用“什么意思?错误消息是什么?您输入的手机号码是否存在?顺便说一句,如果你使用LINQ会更容易。哦,天哪:)那里没有什么可更新的。您正在按手机号码搜索并更新其他字段。如果您需要更新手机号码,那么您应该将其包括在更新列表中,并确保您没有任何其他限制来阻止更新。否则,您需要禁用\启用约束检查(使用手机号码作为主键对于新手来说并不简单)。我更改了我的项目并获得了一个自动递增的ID,然后将该ID设置为主键。现在工作完成了
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();
}