C#检查重复条目,然后运行插入查询,如果没有重复

时间:2017-01-07 04:07:57

标签: c# mysql

嘿伙计们,我需要帮助。我在这里要做的是检查我的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);
        }
    }
}

2 个答案:

答案 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);
             }
        }
    }
}

以上示例捕获重复键错误以显示用户存在的消息,而忽略错误。

当然,所有这些都假定您已在列上创建了UNIQUEPRIMARY KEY约束,而您不希望重复该列。这是数据库设计的基本部分。标准做法是依靠数据库来强制执行唯一性和其他约束,而不是在应用程序级别执行它

答案 1 :(得分:0)

while (cr.Read())是问题,如果(读取)表为空(没有重复),则循环永远不会运行。

但这种做法很糟糕,因为你有竞争条件。如果有人在您检查没有后插入行怎么办?要真正强制执行约束,只需添加

ALTER TABLE sbis.sb_members ADD UNIQUE (lname, fname, mname)

现在你可以避免重复。