仅当满足某些条件时,才从 MySQL 数据库中删除行

本文关键字:MySQL 才从 数据库 删除行 满足 条件 | 更新日期: 2023-09-27 18:36:13

我目前正在为大学开发一个简单的Windows表单错误报告器,遇到了麻烦。我正在尝试创建一个查询,其中用户只能在以下情况下删除错误:

  • 错误名称存在
  • 登录的用户与报告错误的用户匹配。

目前,无论登录哪种用途,查询始终返回"用户登录不正确!",并且不会删除该错误。

我是C#和MySQL的新手,所以我确定我的代码不是编写它的最佳方式。如果难以阅读,我深表歉意。

编辑

这是我基于以下答案的当前代码,但仍然不起作用。我目前在结果中找不到指定的列:bug_submitted_by

 connection = new MySqlConnection(connectionString);
                string check = "SELECT COUNT(*) FROM bugs WHERE bug_name ='" + this.txt_bug_name.Text + "'AND bug_submitted_by='" + this.lbl_user.Text + "';";
                MySqlCommand cmd = new MySqlCommand(check, connection);
                MySqlDataReader reader;
                connection.Open();
                reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    if (reader.GetString("bug_submitted_by").Equals(this.lbl_user.Text))
                    {
                        reader.Close();
                        cmd.Dispose();
                        string query = "DELETE from bugs WHERE bug_name='" + this.txt_bug_name.Text + "';";
                        MySqlCommand cmd2 = new MySqlCommand(query, connection);
                        MySqlDataReader reader2;
                        reader2 = cmd2.ExecuteReader();
                        lbl_message.Text = "Bug Deleted!";
                        reader2.Close();
                        cmd2.Dispose();
                        connection.Close();
                        load_table();
                        Combo_selection();
                        reset(this);
                    }
                    else
                    {
                        lbl_message.Text = "Incorrect user!";
                        reader.Close();
                        cmd.Dispose();
                        connection.Close();
                        cb_names.SelectedIndex = -1;
                    }
                }
                else
                {
                    lbl_message.Text = "Bug Doesn't Exist!";
                }

仅当满足某些条件时,才从 MySQL 数据库中删除行

首先作为旁注,我建议你研究 C# 中的参数化查询。我将在我的答案中使用这种语法,但我相信这对你来说很容易理解。鉴于您正在尝试做多件事(检查是否存在错误,检查错误是否由该用户编写,如果满足条件则删除该错误),我建议您将其分解成碎片并将它们全部放在一起。

首先,我们可以编写一个查询以查看是否存在错误。我们可以很聪明,选择错误名称以及提交者:

using(var conn = new MySqlConnection(ConnectionString)
{
    conn.Open();
    using(var cmd = new MySqlCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "SELECT bug_name, bug_submitted_by FROM bugs WHERE bug_name = @name";
        cmd.Parameters.AddWithValue("@name", this.txt_bug_name.Text);
        using(var reader = cmd.ExecuteReader())
        {
            if(reader.Read())
            {
                // Will fill in next
            }
        }
    }
}

旁注:如果您不熟悉using,请参阅此问题以获取一些见解。这样您就不必担心释放对象,一旦您离开 using 块的范围,它们就会被释放。

因此,上面的查询从 bug 名称与输入匹配的表中提取行。内部 if 语句用于确保返回一行。如果是,请检查用户名并做出相应的反应。如果没有,请做出相应的反应,如下所示:

using(var conn = new MySqlConnection(ConnectionString)
{
    conn.Open();
    using(var cmd = new MySqlCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "SELECT bug_name, bug_submitted_by FROM bugs WHERE bug_name = @name";
        cmd.Parameters.AddWithValue("@name", this.txt_bug_name.Text);
        using(var reader = cmd.ExecuteReader())
        {
            if(reader.Read())
            {
                // We got a row
                if(reader.GetString("bug_submitted_by").Equals(this.lbl_user.Text))
                {
                    // If the username matches delete it
                    using(var cmd2 = new MySqlCommand())
                    {
                        cmd2.Connection = conn;
                        cmd2.CommandText = "DELETE FROM bugs WHERE bug_name = @name";
                        cmd2.Parameters.AddWithValue("@name", this.txt_bug_name.Text);
                        cmd2.ExecuteNonQuery();
                        lbl_message.Text = "Bug Deleted!";
                    }
                }
                else
                {
                    // Username doesn't match
                    lbl_message.Text = "Incorrect user!";
                }
            }
            else
            {
                // We didn't get a row
                lbl_message = "Bug Doesn't Exist!";
            }
        }
    }
}

此查询执行的操作是防止特定 bug 名称出现两次的情况。如果你的数据库限制了这一点,那么你很好。如果没有,则需要实施一些检查以确保只返回一行。

请不要在后续请求中访问数据库。这不仅是不必要的,而且还可能具有误导性,因为在多用户环境中进行的两个调用之间可能会发生很多事情。另一个会话可能已更新或删除此行。

您可以一次性完成所有操作

DELETE 
  FROM bugs
 WHERE bug_name = 'bug1'
   AND bug_submitted_by = 'John';

下面是一个 SQLFiddle 演示