2016-06-28 67 views
1

如何修改我的刪除按鈕代碼以從我的SQL數據庫中刪除選定的行?目前,當我選擇一行並單擊刪除按鈕時,所有行都被刪除。刪除按鈕SQL數據庫Windows窗體應用程序

private void delete_button1_Click_1(object sender, EventArgs e) 
    { 
     if (dataGridView1.SelectedRows.Count > 0) 
     { 
      int selectedIndex = dataGridView1.SelectedRows[0].Index; 
      string sqlquery; 
      string ConString = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString; 
      MySqlConnection con = new MySqlConnection(ConString); 
      con.Open(); 
      int rowID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString()); 
      sqlquery = "DELETE FROM hotel_booking WHERE BookingID = BookingID"; 

      try 
      { 
       MySqlCommand command = new MySqlCommand(sqlquery, con); 
       command.ExecuteNonQuery(); 
       string CmdString = "SELECT * FROM hotel_booking"; 
       MySqlDataAdapter sda = new MySqlDataAdapter(CmdString, con); 
       DataSet ds = new DataSet(); 
       sda.Fill(ds); 
       dataGridView1.DataSource = ds.Tables[0].DefaultView; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
+0

你的問題是在這裏:'sqlquery的= 「DELETE FROM hotel_booking WHERE BookingID = BookingID」'。那其中部分始終是真實的。 – Pikoh

+0

如何才能刪除所選的行? – RossH

回答

1

不要試圖運行此查詢,它會刪除所有的行

DELETE FROM hotel_booking WHERE BookingID = BookingID 

BookingID = BookingID意味着它始終是真實的

我認爲你要使用

int rowID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString()); 
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = "+ rowID; 
+0

對不起,但這是不可接受的。您必須使用參數化查詢來避免Sql注入 – Pikoh

+0

我認爲沒有可能的SQL注入,因爲您解析所選項目的索引並將其保存爲整數。數字索引不能用於注入任何查詢,可以嗎?如果我錯了,那麼我非常抱歉,但請憑一些事實證明我錯了。 @Pikoh –

+0

也許在這種特殊情況下SQL注入的可能性不大,但我們都必須習慣於始終使用參數化查詢。當處理不瞭解何時SQL注入可能會不理解的新手時,這一點更爲重要,所以我們必須教他們在一些情況下使用參數化查詢。 – Pikoh

1

由於您的WHERE cl錯誤,您正在刪除所有行澳洲英語:

DELETE FROM hotel_booking WHERE BookingID = BookingID 

刪除所有行,因爲每一行中BookingID等於BookingID

你想利用rowID爲標準,所以將其添加爲參數:

int rowID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString()); 
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = @rid"; 
try 
{ 
    MySqlCommand command = new MySqlCommand(sqlquery, con); 
    command.Parameters.Add("@rid", SqlDbType.Int).Value = rowID; 
    command.ExecuteNonQuery(); 

注意,將用戶生成的值直接到你的查詢(如"WHERE BookingID = " + rowID...)易受SQL Injection。儘管對於數字類型來說這不是一個很大的危險,但您通常應該像上面那樣使用參數化查詢。

1

你的問題是在這裏:

sqlquery = "DELETE FROM hotel_booking WHERE BookingID = BookingID" 

where部分始終是真實的。

它改成這樣:

sqlquery = "DELETE FROM hotel_booking WHERE BookingID = @BookingID" 
try 
     { 
      MySqlCommand command = new MySqlCommand(sqlquery, con); 
      command.Parameters.AddWithValue("@BookingID", rowID); 
      command.ExecuteNonQuery(); 
      ... 
+0

它現在說rowId在當前上下文中不存在。 – RossH

+0

對不起,錯字。它是'rowID',所以它應該是'command.Parameters.AddWithValue(「@ BookingId」,rowID);',我編輯了我的答案 – Pikoh

+0

仍然無法正常工作,當我點擊delete時什麼也沒有發生。但沒有錯誤。 – RossH

相關問題