簡體   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