2016-06-28 66 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

相关问题