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