首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#检查重复条目,如果没有重复项,则运行insert查询

C#检查重复条目,如果没有重复项,则运行insert查询
EN

Stack Overflow用户
提问于 2017-01-07 04:07:57
回答 2查看 2.4K关注 0票数 1

嘿,伙计们,我需要帮助。这里我要做的是根据winform上的数据条目检查mysql db是否已经存在,使用成员的名称。重复条目的验证工作正常,很好地显示了我想要的消息框,但是它不会执行我所做的插入查询,以防没有找到现有的成员。

我做得对吗?或者有别的办法让它按我想的方式工作。

这是我的代码:

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-07 04:19:21

你似乎知道如何使用预先准备好的语句。所以,为什么在选择中使用字符串连接是个谜

代码语言:javascript
复制
string selectquery = "SELECT * FROM sbis.sb_members WHERE lname ='" + this.lnametxtbox.Text + "' AND fname = '" + this.fnametxtbox.Text + "' AND mname ='" + this.mnametxtbox.Text + "'  ";

但好消息是你根本不需要这个选择。你可以把它扔掉。并利用mysql中的忽略特性。或者,如果您想显示该成员已经存在的消息,只需捕获异常!

代码语言:javascript
复制
 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
EN

Stack Overflow用户

发布于 2017-01-07 05:56:10

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

但是这个方法是不好的,因为你有比赛条件。如果有人在您检查没有行之后插入行呢?要真正执行约束,只需添加

代码语言:javascript
复制
ALTER TABLE sbis.sb_members ADD UNIQUE (lname, fname, mname)

现在你可以避免重复了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41517674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档