嘿伙计们,我需要帮助。我在这里要做的是检查我的mysql数据库,如果一个成员已经存在使用基于我的winform上的数据条目的成员的名称。重复条目的验证工作,完全按照我想要的方式显示消息框,但是如果没有找到现有成员,它不会执行我所做的插入查询。
我这样做是否正确?还是有另一种方式让它以我想要的方式运作。
这是我的代码:
private void metroButton1_Click(object sender, EventArgs e) {
using (con = new MySqlConnection(constring)) {
string selectquery = "SELECT * FROM sbis.sb_members WHERE lname ='" + this.lnametxtbox.Text + "' AND fname = '" + this.fnametxtbox.Text + "' AND mname ='" + this.mnametxtbox.Text + "' ";
MySqlCommand command2 = new MySqlCommand(selectquery, con);
string insertquery = "INSERT INTO sbis.sb_members (lname, fname, mname, position, appointment, address, contactnum, birthdate, civilstatus, educattainment, eligibility, terms_idterms, polparties_id, sex) VALUES (@lname, @fname, @mname, @position, @appointment, @address, @contactnum, @birthdate, @civilstatus, @educattainment, @eligibility, @terms_idterms, @polparties_id, @sex)";
MySqlCommand cmd = new MySqlCommand(insertquery, con);
string lname, fname, mname, address, contactnum, educattainment;
lname = lnametxtbox.Text;
fname = fnametxtbox.Text;
mname = mnametxtbox.Text;
address = addresstxtbox.Text;
contactnum = contacttxtbox.Text;
educattainment = eductxtbox.Text;
var birthdate = birthdatedtp.Value.Date;
cmd.Parameters.AddWithValue("@lname", lname);
cmd.Parameters.AddWithValue("@fname", fname);
cmd.Parameters.AddWithValue("@mname", mname);
cmd.Parameters.AddWithValue("@address", address);
cmd.Parameters.AddWithValue("@contactnum", contactnum);
cmd.Parameters.AddWithValue("@position", position);
cmd.Parameters.AddWithValue("@appointment", appointment);
cmd.Parameters.AddWithValue("@birthdate", birthdate);
cmd.Parameters.AddWithValue("@sex", sex);
cmd.Parameters.AddWithValue("@eligibility", eligibility);
cmd.Parameters.AddWithValue("@civilstatus", civilstatus);
cmd.Parameters.AddWithValue("@terms_idterms", terms);
cmd.Parameters.AddWithValue("@polparties_id", polparties);
cmd.Parameters.AddWithValue("@educattainment", educattainment);
try {
con.Open();
MySqlDataReader cr = command2.ExecuteReader();
while (cr.Read()) {
if (cr.HasRows == true) {
MessageBox.Show("Member already exists.", "Duplicate Entry", MessageBoxButtons.OK, MessageBoxIcon.Warning);
} else if (cr.HasRows == false) {
if (cmd.ExecuteNonQuery() > 0) {
MessageBox.Show("Saved", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
cr.Close();
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
}
答案 0 :(得分:2)
您似乎知道如何使用预准备语句。因此,为什么在SELECT
中使用字符串连接是一个谜string selectquery = "SELECT * FROM sbis.sb_members WHERE lname ='" + this.lnametxtbox.Text + "' AND fname = '" + this.fnametxtbox.Text + "' AND mname ='" + this.mnametxtbox.Text + "' ";
但好消息是你完全不需要这个SELECT。你可以扔掉它。并在mysql中使用IGNORE功能。或者,如果要显示该成员已存在的消息,只需捕获异常!
using (con = new MySqlConnection(constring))
{
string insertquery = "INSERT INTO sbis.sb_members (lname, fname, mname, position, appointment, address, contactnum, birthdate, civilstatus, educattainment, eligibility, terms_idterms, polparties_id, sex) VALUES (@lname, @fname, @mname, @position, @appointment, @address, @contactnum, @birthdate, @civilstatus, @educattainment, @eligibility, @terms_idterms, @polparties_id, @sex)";
MySqlCommand cmd = new MySqlCommand(insertquery, con);
string lname, fname, mname, address, contactnum, educattainment;
lname = lnametxtbox.Text;
fname = fnametxtbox.Text;
mname = mnametxtbox.Text;
address = addresstxtbox.Text;
contactnum = contacttxtbox.Text;
educattainment = eductxtbox.Text;
var birthdate = birthdatedtp.Value.Date;
cmd.Parameters.AddWithValue("@lname", lname);
cmd.Parameters.AddWithValue("@fname", fname);
cmd.Parameters.AddWithValue("@mname", mname);
cmd.Parameters.AddWithValue("@address", address);
cmd.Parameters.AddWithValue("@contactnum", contactnum);
cmd.Parameters.AddWithValue("@position", position);
cmd.Parameters.AddWithValue("@appointment", appointment);
cmd.Parameters.AddWithValue("@birthdate", birthdate);
cmd.Parameters.AddWithValue("@sex", sex);
cmd.Parameters.AddWithValue("@eligibility", eligibility);
cmd.Parameters.AddWithValue("@civilstatus", civilstatus);
cmd.Parameters.AddWithValue("@terms_idterms", terms);
cmd.Parameters.AddWithValue("@polparties_id", polparties);
cmd.Parameters.AddWithValue("@educattainment", educattainment);
try
{
if (cmd.ExecuteNonQuery() > 0)
{
MessageBox.Show("Saved", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
if (ex.Message.ToLower().Contains("duplicate key"))
{
MessageBox.Show("Member already exists.", "Duplicate Entry", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else {
MessageBox.Show(ex.Message);
}
}
}
}
以上示例捕获重复键错误以显示用户存在的消息,而忽略错误。
当然,所有这些都假定您已在列上创建了UNIQUE
或PRIMARY KEY
约束,而您不希望重复该列。这是数据库设计的基本部分。标准做法是依靠数据库来强制执行唯一性和其他约束,而不是在应用程序级别执行它
答案 1 :(得分:0)
while (cr.Read())
是问题,如果(读取)表为空(没有重复),则循环永远不会运行。
但这种做法很糟糕,因为你有竞争条件。如果有人在您检查没有后插入行怎么办?要真正强制执行约束,只需添加
ALTER TABLE sbis.sb_members ADD UNIQUE (lname, fname, mname)
现在你可以避免重复。