2017-03-08 94 views
0

我正在致力于在将csv插入数据库之前对其进行验证。我已经完成了将它们插入到数据库中的一段,但不知道如何验证重复记录并仅将重复记录插入到数据库中。Csv如下所示,我们可以接收ProdID作为CSV中的重复项只将csv中的重复记录插入到数据库中

ProdID,Name,Color,Availability 
P01,Product1,Red,Yes 
P02,Product2,Blue,Yes 
P03,Product3,Yellow,No 
P01,Product4,Red,Yes 
P04,Product5,Black,Yes 

表中有五场与场中的一个是

class Products 
{ 
    static void Main(string[] args) 
    { 
     string location = "\Products.csv"; 
     List<Products> ProductsList= ReadInCSV(location); 
     var connStr = ConfigurationManager.ConnectionStrings["ProgConnectionString"].ConnectionString; 

     // Need to validate them before putting them in to the table 

     string sqlString = "INSERT INTO PRODUCTS (ProdID,Name,Color,Availability,Duplicate) VALUES (@ProdID,@Name,@Color,@Availability,@Duplicate);"; 
     for (int i = 0; i < ProductsList.Count; i++) 
     { 
      using (MySqlConnection conn = new MySqlConnection(connStr)) 
      using (MySqlCommand comm = new MySqlCommand(sqlString, conn)) 
      { 
       comm.Parameters.Add("@ProdID", MySqlDbType.VarChar).Value = ProductsList[i].ProdID; 
       comm.Parameters.Add("@Name", MySqlDbType.VarChar).Value = ProductsList[i].Name; 
       comm.Parameters.Add("@Color", MySqlDbType.VarChar).Value = ProductsList[i].Color; 
       comm.Parameters.Add("@Availability", MySqlDbType.VarChar).Value = ProductsList[i].Availability; 
       comm.Parameters.Add("@Duplicate", MySqlDbType.VarChar).Value = "Yes"; 
       conn.Open(); 
       comm.ExecuteNonQuery(); 
       conn.Close(); 
      } 
     } 
    } 
} 

我不知道我怎么能检查在CSV重复的记录,做一个只插入到记录的重复字段这是重复的。

+0

我不清楚你问什么?你想只插入不同的记录(即排除重复)吗?或者你只想插入重复的记录(如果是这样,你想要所有副本的副本或只是一个代表重复的实例)? – maccettura

+1

哪些是“csv中的重复记录”?它们对我来说都很明显。 –

+0

@maccettura我只需要插入重复记录。这里P01正在重复,我只需要将这两条记录插入到表中 – xyz

回答

3

根据你的评论,你只想插入两个重复的记录。在你的例子p01。由各自ProdID

ProductsList.GroupBy(p => p.ProdID).Where(p => p.Count() > 1).SelectMany(x => x); 

这将集团的项目,然后我们只选择实例所在组中包含多个实例:

这可以用一个简单的LINQ查询来解决。

使用此代替你的for循环:

foreach(var prod in ProductsList.GroupBy(p => p.ProdID).Where(p => p.Count() > 1).SelectMany(x => x)) 
{ 
    using (MySqlConnection conn = new MySqlConnection(connStr)) 
    using (MySqlCommand comm = new MySqlCommand(sqlString, conn)) 
    { 
     comm.Parameters.Add("@ProdID", MySqlDbType.VarChar).Value = prod.ProdID; 
     comm.Parameters.Add("@Name", MySqlDbType.VarChar).Value = prod.Name; 
     comm.Parameters.Add("@Color", MySqlDbType.VarChar).Value = prod.Color; 
     comm.Parameters.Add("@Availability", MySqlDbType.VarChar).Value = prod.Availability; 
     comm.Parameters.Add("@Duplicate", MySqlDbType.VarChar).Value = "Yes"; 
     conn.Open(); 
     comm.ExecuteNonQuery(); 
     conn.Close(); 
    } 
} 

我创建了一个fiddle演示

+0

谢谢。但我在'prod.ProdID'中发生错误,说''bool'不包含'ProdID'的定义,并且没有可以找到接受类型'bool'的第一个参数的扩展方法'ProdID'指令或程序集引用?)'我应该使用ProductsList [i] .ProdID;而不是 – xyz

+0

我用一个小工具更新了我的答案,我原来的代码不正确 – maccettura

+1

谢谢了。完美的作品 – xyz

0

我想你可以在Query中添加“where @duplicate like'yes'”。