我写了一条声明来更新详细信息,它属于主键(移动)。但它仅适用于其他列。当我更新手机号码时。它没有改变。
这是我的查询
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])
)
有人可以告诉我错误吗?
答案 0 :(得分:0)
由于where子句,您对[mobile]的更新没有任何意义。它指出:“更新所有这些东西,包括移动设备的移动设备所在的位置。在这两种情况下,您都使用textbox3.Text,因此它永远不会更新,因为它是相同的值。
例如
update foo set mobile = 'abc' where mobile = 'abc'
在给出该查询的情况下,移动永远不会与'abc'无关。
如果要解决此问题,则需要正确设计表。有一个单独的主键:
PersonId int identity primary key
然后您可以做:
update Person set mobile = 'abc' where PersonId = 1
并将PersonId存储在用户无需查看的地方。
如果您要通过Mobile大量查询该表,则可以考虑在Mobile列上添加一个二级索引,如果您需要唯一的话,还要添加一个唯一约束。
另外,一般来说,请通读WinForm DataBinding的GOOD,因为稍后解决此问题的方式将给您带来麻烦。 BindingContext是需要理解的重要类,但需要花费一些时间。稍后将在SPADES中使此时间回来,因此请仔细阅读。
答案 1 :(得分:0)
您想更新主键而不是插入新记录有点奇怪。无论如何,请检查以下有关禁用约束条件强制实施的问题的答案:
答案 2 :(得分:0)
为了更新手机号码,您需要添加一个额外的文本框,或者提供旧的手机号码。
如果您使用的是WPF或Windows表单,那么我将为旧手机号码添加一个新的表单字段,并将该字段传递给您的where子句。只要原来的手机号码完全匹配,此功能就可以使用。假设您正在执行varchar(50),则对于以不同方式输入数据的人,例如(555)555-5555与555.555.5555,可能会出错。
答案 3 :(得分:0)
正如已经说过的,将字段更新为与您进行搜索时相同的值没有任何意义。另外,您永远不要编写这样的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();
}