2017-03-08 95 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'」。