C#如何在将大量数据插入MS Access数据库之前检查记录是否存在?

问题描述:

我四处张望了一下,但大部分的答案涉及SQL存储过程,我不能接口,或者预定值像我目前使用的代码块的该位是有一点点的帮助"Select count(*) from MyTable where id = 1"C#如何在将大量数据插入MS Access数据库之前检查记录是否存在?

另一个问题。正如你所看到的,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],对不对?

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

+0

我不认为Db不会为唯一字段添加重复值。你会得到一个例外。 – Prajwal

+0

它不会?嗯,以及我没有实现我早先想到的想法,但我有一个问题@Prajwal,整个查询是否会因为我将整个DataGridView的内容添加到数据库中而导致此异常中断。理想情况下,它将会排除出现异常的字段并插入可以执行的字段。我在这篇文章中没有暗示的另一个场景是,我需要明确知道数据格式视图中的数据库中是否存在类似的字段,然后将它们的值添加到数据库中的原始数据中。 – Aroueterra

+0

您可以随时使用不同的查询进行检查。尝试使用该唯一ID选择一个项目,如果它返回0行它的罚款。否则不要添加它。 – Prajwal

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

WHERE ACTB.ID <> @ID 

这是假设ID不是由插入生成的自动递增字段。如果是,那么你可以使用WHERE子句中的其他字段,如名字和姓氏

+0

虽然我确实有一个自动增加的ID字段。我提到的ID字段是特定于员工的,并且是完全独特的。我不确定你的查询确切地做了什么。 – Aroueterra