数据库
首页 > 数据库> > 在更新记录时如何防止数据库中的重复记录?

在更新记录时如何防止数据库中的重复记录?

作者:互联网

在我的mysql表中,我看起来像这样一个

ControlNum|Title  |NumOfEpis|Description|
001       |naruto |500      |some text  |
002       |conan  |700      |some text  |

现在,我在C#中创建了一个用户控件,允许用户在其中更新除主“ ControlNum”之外的所有列.因此,假设每个列在该用户控件中都有其自己的文本框,以便避免在标题列中重复,例如,如果用户编辑第2行标题并将其放置为“火影忍者”,它也会被重复..所以我创建了此方法称为checkData();

void checkData()
    {
        SuspendLayout();
        try
        {
            MySqlConnection conn = new MySqlConnection(myConnection);
            conn.Open();
            MySqlCommand command = new MySqlCommand("SELECT * FROM maindatabase.animelist where TitleAnime=?Title;", conn);
            //command.Parameters.AddWithValue("?CN", int.Parse(a.ToString()));
            command.Parameters.AddWithValue("?Title", textBox3.Text);
            MySqlDataReader reader = command.ExecuteReader();

            int ctr = 0;
            while (reader.Read())
            {
                ctr++;

            }
            if (ctr == 1)
            {
                my = Form.ActiveForm as MyList;
                my.msg = new Message_Box();
                my.msg.Descrip.Text = "Record is already in the Database";
                my.msg.Title.Text = "Duplicate Record";
                my.msg.ShowDialog();
            }
            else
            {

                updateData();
            }


            conn.Close();
            ResumeLayout();
        }
        catch (Exception ex)
        {
            MessageBox.Show("" + ex);
        }
    }

 它正在工作,但是我的问题是,如果用户只更新了Epis和descrip的数量而又不打算真正更新标题,我的方法仍然会检测到重复,因为我的逻辑是“ if(ctr == 1) “..我认为我缺少某种方法,或者我在这里使用了错误的方法.所以我希望有人能启发我.

解决方法:

如果您的应用程序支持多个用户,则需要确保在检查重复项和数据库更新之间没有其他用户进行更改.

最简单的方法是按照建议的建议,在标题列上创建UNIQUE约束:

ALTER TABLE maindatabase.animelist 
ADD CONSTRAINT U_animelist_TitleAnime UNIQUE (TitleAnime)

然后,数据库引擎将强制执行唯一的标题,并且您的客户端可以通过捕获任何违反约束的异常来处理用户反馈:

void checkData()
{
    SuspendLayout();
    try
    {

        updateData();

    }
    catch (Exception ex)
    {
        MySqlException sqlEx = ex as MySqlExecption;
        // If there is a constraint violation error.
        // (I may have the wrong error number, please test.)
        if (sqlEx != null && sqlEx.Number == 1062) 
        {
            my = Form.ActiveForm as MyList;
            my.msg = new Message_Box();
            my.msg.Descrip.Text = "Record is already in the Database";
            my.msg.Title.Text = "Duplicate Record";
            my.msg.ShowDialog();
        } 
        else 
        {
            MessageBox.Show("" + ex);
        }
    }
    finally
    {
        ResumeLayout();
    }
}

标签:unique,sql-update,c,mysql
来源: https://codeday.me/bug/20191028/1951900.html