首页 > 解决方案 > 在将列表框项目插入 MS Access 数据库之前检查它

问题描述

如何避免我的 MS Access 数据库中的重复数据?

如果 listbox1 中的项目已经存在于我的 MS Access 数据库中并且它存在,我如何检查它,然后继续下一个 listbox1 项目并检查该项目是否已经存在。

private void button1_Click(object sender, EventArgs e)
{
        OleDbCommand cmd = new OleDbCommand("Insert into ASD (SerialNumber) values (@SerialNumber)", con);

        var parameter3 = new OleDbParameter("@SerialNumber", OleDbType.LongVarChar);
        parameter3.Value = textBox1.Text;
        cmd.Parameters.Add(parameter3);  
        con.Open();

        try
        {
            for (int a = 0; a < listBox1.Items.Count; a++)
            {
                OleDbDataAdapter da;
                DataTable dt = new DataTable();
                da = new OleDbDataAdapter("select * from ASD where SerialNumber = '"+listBox1.Text+"'", con);
                da.Fill(dt);

                if (dt.Rows.Count > 0)
                {
                    MessageBox.Show( "Serial Number Already Inserted!");
                    con.Close();
                }
                else
                {
                    for (int i = 0; i < listBox1.Items.Count; i++)
                    {                          
                        cmd.Parameters["@SerialNumber"].Value = listBox1.Items[i];                       
                    }

                    cmd.ExecuteNonQuery();
                    MessageBox.Show("Item Added");
                }              
            }

            con.Close();
        }
        catch (Exception x)
        {
            MessageBox.Show(x + "");
        }
}

标签: c#

解决方案


一般来说,将数据库操作与业务逻辑和表示分开是一个好主意。一一处理问题。

要检查您的表中是否有项目,您有几个选项。

有故障的 SQL 端:在 SerialNumber 列上创建唯一索引。每当您尝试使用现有的 SerialNumber 值添加新记录时,插入都会失败并且您会收到一条错误消息。我不推荐这种方法。

带有查询的 SQL 端:如果此 SerialNumber 值已在表中,则在尝试插入新值之前对数据库运行查询。我不推荐这个,因为它会转化为大量的 SQL 查询。

代码端:使用单个 SQL 查询获取内存中 SerialNumber 值的完整列表。如果下一个值已经在列表中,请检查此列表。如果记录数不太高,我会这样做。

如果记录数很高,我会创建一个存储过程并使用完整的新记录列表调用它。如果可以,此 SP 将插入新记录,并将返回失败的记录。


推荐阅读