仅在满足特定条件时才从MySQL数据库中删除行

时间:2015-01-04 18:07:42

标签: c# mysql

我目前正在为大学工作一个简单的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!";
                }

2 个答案:

答案 0 :(得分:1)

首先,我建议您研究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,请参阅此question以获取一些见解。这样您就不必担心处理对象了,一旦离开使用块的范围,它们就会被处理掉。

因此,上面的查询从错误名称与输入匹配的表中提取行。内部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!";
            }
        }
    }
}

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

答案 1 :(得分:1)

请不要在后续请求中点击数据库。这不仅是不必要的,而且可能也会产生误导,因为在多用户环境中进行的两次调用之间可能会发生很多事情。另一个会话可能已经更新或删除了这一行。

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

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

这是 SQLFiddle 演示