【问题标题】:Delete Button SQL Database Windows Form Application删除按钮 SQL 数据库 Windows 窗体应用程序
【发布时间】:2016-06-28 14:08:56
【问题描述】:

如何修改删除按钮代码以从 SQL 数据库中删除选定的行?目前,当我选择一行并单击删除按钮时,所有行都会被删除。

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);
            }
        }
    }

【问题讨论】:

  • 你的问题在这里:sqlquery = "DELETE FROM hotel_booking WHERE BookingID = BookingID"。那部分总是正确的。
  • 如何只删除选定的行?

标签: c# mysql sql visual-studio


【解决方案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;

【讨论】:

  • 抱歉,这是不可接受的。您必须使用参数化查询来避免 Sql Injection
  • 我认为没有可能的SQL注入,因为您解析了选定项目的索引,并且它以整数形式保存。并且数字索引不能用于注入任何查询,可以吗?如果我错了,那么我非常抱歉,但请用一些事实证明我错了。 @Pikoh
  • 也许在这种特殊情况下不太可能发生 SQL 注入,但我们都必须习惯始终使用参数化查询。这在与不了解何时可能发生 SQL 注入的新手打交道时更为重要,因此我们必须教他们在所有情况下使用参数化查询。
  • 没问题:),但正如@Pikoh 所说,你不应该使用这个例子。在这种情况下,可以使查询看起来像这样,但在其他情况下,您应该将他的解决方案与参数化查询一起使用。
  • @RossH 是的,它有效,但要非常小心,您应该使用参数化查询。顺便说一句,在我的回答中还有另一个错字,这就是为什么它对你不起作用。
【解决方案2】:

由于WHERE 子句中的错误,您当前正在删除所有行:

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 的攻击。虽然对于数字类型来说这不是一个很大的危险,但您通常应该像上面那样使用参数化查询。

【讨论】:

    【解决方案3】:

    你的问题在这里:

    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();
                ...
    

    【讨论】:

    • 现在说 rowId 在当前上下文中不存在。
    • 抱歉,打错字了。是rowID,所以应该是command.Parameters.AddWithValue("@BookingId", rowID);,我已经编辑了我的答案
    • 仍然无法正常工作,当我单击删除时根本没有任何反应。但没有错误。
    • 调试您的代码并检查rowID 的值。也许不是数据库中存在的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多