如何在将大量数据插入数据库之前检查记录是不是存在?

Posted

技术标签:

【中文标题】如何在将大量数据插入数据库之前检查记录是不是存在?【英文标题】:How to check if a record exists before inserting a lot of data into a database?如何在将大量数据插入数据库之前检查记录是否存在? 【发布时间】:2016-11-29 04:18:31 【问题描述】:

我环顾了一下,但大多数答案都与我无法接口的 SQL 存储过程或像 "Select count(*) from MyTable where id = 1" 这样的预定值有关

我目前正在使用这段代码块,它从另一个问题中得到了一些帮助。如您所见,Access 数据库作为一个整体插入。假设我在名为 ID 的表中添加了另一个旨在唯一的列,我如何确定它是否已被插入?

using (OleDbConnection conn = new OleDbConnection(Con))
using (OleDbCommand cmd = new OleDbCommand())

    cmd.Connection = conn;
    conn.Open();
    for (int i = 0; i <= DGVExcel.Rows.Count - 1; i++)
    
        cmd.CommandText =
            "Insert INTO ACTB (FirstName, LastName, GrossIncome, LessTNT, TaxableIncomeCE, TaxableIncomePE, GrossTaxableIncome, LessTE, LessPPH, NetTax, TaxDue, HeldTaxCE, HeldTaxPE, TotalTax) " +
            "VALUES(@First, @Last, @Gross, @LessTNT, @TCI, @ADDTI, @GTI, @LessTE, @LessPPH, @LessNTI, @TD, @TWCE, @TWPE, @TATW)";
        //cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(txtID.Text));
        cmd.Parameters.AddWithValue("@First", DGVExcel.Rows[i].Cells[0].Value);
        cmd.Parameters.AddWithValue("@Last", DGVExcel.Rows[i].Cells[1].Value);
        cmd.Parameters.AddWithValue("@Gross", Convert.ToDouble(DGVExcel.Rows[i].Cells[2].Value));
        cmd.Parameters.AddWithValue("@LessTNT",
            Convert.ToDouble(DGVExcel.Rows[i].Cells[3].Value));
        cmd.Parameters.AddWithValue("@TCI", Convert.ToDouble(DGVExcel.Rows[i].Cells[4].Value));
        cmd.Parameters.AddWithValue("@ADDTI", Convert.ToDouble(DGVExcel.Rows[i].Cells[5].Value));
        cmd.Parameters.AddWithValue("@GTI", Convert.ToDouble(DGVExcel.Rows[i].Cells[6].Value));
        cmd.Parameters.AddWithValue("@LessTE", Convert.ToDouble(DGVExcel.Rows[i].Cells[7].Value));
        cmd.Parameters.AddWithValue("@LessPPH",
            Convert.ToDouble(DGVExcel.Rows[i].Cells[8].Value));
        cmd.Parameters.AddWithValue("@LessNTI",
            Convert.ToDouble(DGVExcel.Rows[i].Cells[9].Value));
        cmd.Parameters.AddWithValue("@TD", Convert.ToDouble(DGVExcel.Rows[i].Cells[10].Value));
        cmd.Parameters.AddWithValue("@TWCE", Convert.ToDouble(DGVExcel.Rows[i].Cells[11].Value));
        cmd.Parameters.AddWithValue("@TWPE", Convert.ToDouble(DGVExcel.Rows[i].Cells[12].Value));
        cmd.Parameters.AddWithValue("@TATW", Convert.ToDouble(DGVExcel.Rows[i].Cells[13].Value));
        cmd.ExecuteNonQuery();
    

到目前为止,这是我的想法:

cmd = ("If not exists( Select*from ACTB where ID = @ID....

啊该死的我忘了我不能预先确定价值。它必须以某种方式从 Datagridview 中提取,因为这些行很多,我不能简单地指定 DGV.Rows[i].Cells[1],对吧?

编辑: 我没有在帖子中暗示我需要明确知道数据库中是否有来自 Datagridview 的类似字段,因为在一个单独的函数中,我然后将它们的值添加到数据库中的原始值。没有重复,但它们的值会更新。就像 Employee1 有 10000 的收入工资一样,表看到重复,将其版本的收入工资添加到字段匹配的数据库中的原始数据中。

【问题讨论】:

我认为 Db 不会为唯一字段添加重复值。你会得到一个例外。 不会?嗯,好吧,我还没有实现我之前想到的想法,但我有一个问题@Prajwal,如果它遇到这个异常,整个查询会中断,因为我正在将整个 DataGridView 的内容添加到数据库中。理想情况下,它会忽略有异常的字段并插入有异常的字段。我在帖子中没有暗示的另一种情况是,我需要从 Datagridview 明确知道数据库中是否有类似的字段,然后将它们的值添加到数据库中的原始值。 您可以随时使用不同的查询进行检查。尝试使用该唯一 ID 选择一个项目,如果它返回 0 行则很好。否则不要添加。 【参考方案1】:

一种选择是在查找@ID 的语句中包含一个WHERE 子句。

WHERE ACTB.ID <> @ID

这是假设 ID 不是插入生成的自动增量字段。如果是,那么您可以在 WHERE 子句中使用其他字段,例如 FirstName 和 LastName

【讨论】:

虽然我确实有一个自动递增的 ID 字段。我提到的 ID 字段是特定于员工的,并且是完全唯一的。我不确定您的查询到底是做什么的。

以上是关于如何在将大量数据插入数据库之前检查记录是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .forEach() 插入多个集合并检查它是不是存在

laravel 在插入之前检查记录是不是存在,这是一种有效的方法

实体框架:在插入新记录之前检查记录是不是存在

如何检查记录是不是已经存在,然后在 laravel 中更新或插入?

在插入之前检查现有记录

如何在插入 MySQL 之前检查表中是不是存在名称 [重复]