2013-02-28 97 views
1

我的代碼專門針對更新代碼出現問題。爲什麼SQL語句需要更新更多記錄?

private void updatebtn_Click(object sender, EventArgs e) 
{ 
    String Fname = fnametb.Text; 
    String Lname = lnametb.Text; 
    String Age = agetb.Text; 
    String Address = addresstb.Text; 
    String Course = coursetb.Text; 

    { 
     connection.Open(); 
     OleDbCommand select = new OleDbCommand(); 
     select.Connection = connection; 
     select.CommandText = "Select * From Accounts"; 
     OleDbDataReader reader = select.ExecuteReader(); 
     while (reader.Read()) 
     { 
      OleDbCommand insert = new OleDbCommand("UPDATE Accounts SET [email protected], [email protected], [email protected], [email protected], [email protected] WHERE Lastname='"+ reader[2].ToString()+"'", connection); 

      insert.Parameters.Add("@Fname", OleDbType.VarChar).Value = Fname; 
      insert.Parameters.Add("@Lname", OleDbType.VarChar).Value = Lname; 
      insert.Parameters.Add("@Age", OleDbType.VarChar).Value = Age; 
      insert.Parameters.Add("@Address", OleDbType.VarChar).Value = Address; 
      insert.Parameters.Add("@Course", OleDbType.VarChar).Value = Course; 
      insert.ExecuteNonQuery(); 

      fnametb.Clear(); 
      lnametb.Clear(); 
      agetb.Clear(); 
      addresstb.Clear(); 
      coursetb.Clear(); 
      listBox1.Items.Clear(); 
      searchtb.Clear(); 
     } 
     connection.Close(); 
    } 
} 

上面是我的代碼。每當我更新一條記錄時,表中的所有記錄都會受到影響。我認爲讀者有問題。 請幫忙,謝謝。

+2

請爲您的問題選擇一個有意義的標題。 – 2013-02-28 08:23:14

+5

第一個問題:你有一個潛在的SQL注入攻擊。使用「where」部分的參數以及新值。另外,鑑於它是一個*更新*,爲什麼你叫它*插入*? – 2013-02-28 08:24:31

+0

調試你的代碼,並看看你的where語句裏有什麼。直接對你的數據庫執行你的sql-statemend – Tomtom 2013-02-28 08:24:39

回答

5

您選擇的所有記錄,

select.CommandText = "Select * From Accounts"; 

然後你用循環讀者的結果。

while (reader.Read()) 

然後你更新每條記錄。

String sql = "UPDATE Accounts SET [email protected], [email protected], [email protected], [email protected], [email protected] WHERE Lastname='"+ reader[2].ToString()+"'"; 
OleDbCommand insert = new OleDbCommand(sql, connection); 

那麼,爲什麼你感到驚訝?

我不確定你真正想要什麼。也許你已經忘記爲你的第一個選擇添加WHERE子句,並且你想使用lnametb.Text。但當時的第一選擇僅僅是多餘的,你可以使用WHERE的更新命令:

String sql = "UPDATE Accounts SET [email protected], [email protected], [email protected], [email protected], [email protected] WHERE [email protected]"; 
insert.Parameters.Add("@LastName", OleDbType.VarChar).Value = lnametb.Text; 

順便說一句,你爲什麼叫你更新命令insert

+0

感謝您的回答。我只是忽略了插入,因爲我剛剛複製了我的插入命令,然後只更改其他變量。 – Harold 2013-02-28 08:53:13

0

您從表中迭代所有記錄,並設置爲一個值.. 這是錯誤的訪問只有匹配的記錄和更新

1

的問題是,由於某種原因,你在一個循環中執行更新讀者發現的每一條記錄。當然,讀者會發現你在表格中的每一個姓氏,所以更新會改變每一個記錄!

您需要刪除的循環,去除讀者,並更改更新命令從屏幕上的輸入框,一個使用的姓氏:

connection.Open(); 
OleDbCommand update = new OleDbCommand("UPDATE Accounts SET [email protected], [email protected], [email protected], [email protected] WHERE [email protected]", connection); 
update.Parameters.Add("@Fname", OleDbType.VarChar).Value = Fname; 
update.Parameters.Add("@Lname", OleDbType.VarChar).Value = Lname; 
update.Parameters.Add("@Age", OleDbType.VarChar).Value = Age; 
update.Parameters.Add("@Address", OleDbType.VarChar).Value = Address; 
update.Parameters.Add("@Course", OleDbType.VarChar).Value = Course; 
update.ExecuteNonQuery(); 
connection.Close(); 

當然,這不會讓你更新姓氏:爲此,您需要提供某種獨立的學生ID,並將其用於UPDATEWHERE子句中,而不是姓氏。