仅当满足某些条件时,才从 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!";
}
首先作为旁注,我建议你研究 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 演示