【问题标题】:Trying to avoid duplicate entries for SQL insert from a CSV file import尝试从 CSV 文件导入中避免 SQL 插入的重复条目
【发布时间】:2018-05-30 15:21:01
【问题描述】:

我正在尝试将 CSV 文件数据导入 SQL Server 数据库。我有超过 15000 行,并且它每天都会向 CSV 文件添加新行。我需要的只是将新添加的行插入到已经存在的数据库中。 我现在遇到的问题,如果我导入文件,它会插入所有内容,包括旧的 15000 行。我正在考虑将 csv 数据插入临时表并过滤掉重复的行。但我不知道该怎么做。

private void Save_Import_Data_SQL(DataTable importData)
        {

            using(SqlConnection conn = new SqlConnection(myconnstring))
            {
                conn.Open();
                foreach(DataRow importRow in importData.Rows)
                {

                    DateTime Start_Date_tt = ConvertStringToDate(importRow["Start date"].ToString());
                    Decimal Start_Time_tt = ConvertStringToDecimal(importRow["Start time"].ToString());
                    DateTime Finish_Date_tt = ConvertStringToDate(importRow["Finish date"].ToString());
                    Decimal Finish_Time_tt = ConvertStringToDecimal(importRow["Finish time"].ToString());

                    Decimal Pieces_tt = ConvertStringToDecimal(importRow["Pieces"].ToString());
                    Decimal cycle_tt = ConvertStringToDecimal(importRow["Average part cycle time"].ToString());
                    Decimal length_tt = ConvertStringToDecimal(importRow["Length_pa"].ToString());


                    SqlCommand cmd = new SqlCommand("INSERT INTO Silver_Robot(Program_S,Grpup_S,Start_Date_S,Start_Time_S,Pieces_S,Finish_Date_S,Finish_Time_S,Average_Part_Cycle_Time_S,Mode_S,Length_S) VALUES(@program,@group,@start_Date,@start_time,@pieces,@finish_date,@finish_time,@avarage_part,@mode_p,@length_p)", conn);

                    cmd.Parameters.AddWithValue("@program", importRow["Program"]);
                    cmd.Parameters.AddWithValue("@group", importRow["Group"]);
                    cmd.Parameters.AddWithValue("@start_Date", Start_Date_tt);
                    cmd.Parameters.AddWithValue("@start_time", Start_Time_tt);
                    cmd.Parameters.AddWithValue("@pieces", Pieces_tt);
                    cmd.Parameters.AddWithValue("@finish_date", Finish_Date_tt);
                    cmd.Parameters.AddWithValue("@finish_time", Finish_Time_tt);
                    cmd.Parameters.AddWithValue("@avarage_part", cycle_tt);
                    cmd.Parameters.AddWithValue("@mode_p", importRow["Mode"]);
                    cmd.Parameters.AddWithValue("@length_p", length_tt );
                    cmd.ExecuteNonQuery();
                }

            }
        }

任何帮助将不胜感激

【问题讨论】:

  • 临时表不知道怎么办?如何创建表,如何向表中插入记录(顺便说一句,SqlBulkCopy 可能比SqlCommend 更快地上传数据)或如何将新记录从临时表复制到实时表?
  • 我可以将数据插入临时表,但我不知道如何比较它并将其移动到新表。我也尝试进行批量插入,但它对我不起作用,我猜这是服务器的一些权限问题,因为我使用的是我的合作服务器,我无法完全访问所有内容。我是一名电工,对服务器没有太多经验。
  • 不要创建一个新的真实表,当你声明你的临时表在它的名字前面使用一个#(CREATE Table #myTempTable (Foo int, Bar nvarchar(100))),这是一个只存在于生命周期的临时表你的连接。您应该能够批量插入该临时表。至于如何比较,哪些信息需要相同才能被认为是“重复”,我们需要知道这一点才能知道如何过滤掉重复。这是我执行此确切过程的答案stackoverflow.com/questions/31058886/…
  • 非常感谢。我想我现在知道如何做到这一点了。
  • 如果您解决了自己的问题,请随时发布答案并将其标记为已接受。

标签: c# sql


【解决方案1】:

您可以只在 SQL 中使用 IF NOT EXIST:https://forums.asp.net/t/1738957.aspx?SqlCommand+with+IF+NOT+EXISTS+statement

SQL Server Insert if not exist

所以如果你只是替换你的 SQL 命令:

SqlCommand cmd = new SqlCommand("INSERT INTO Silver_Robot(Program_S,Grpup_S,Start_Date_S,Start_Time_S,Pieces_S,Finish_Date_S,Finish_Time_S,Average_Part_Cycle_Time_S,Mode_S,Length_S) VALUES(@program,@group,@start_Date,@start_time,@pieces,@finish_date,@finish_time,@avarage_part,@mode_p,@length_p)", conn);

这样的:

SqlCommand cmd = new SqlCommand("IF NOT EXISTS (SELECT * FROM Silver_Robot WHERE Program_S = @program AND Grpup_S = @group AND Start_Date_S = @start_Date AND Start_Time_S = @start_time AND Pieces_S = @pieces AND Finish_Date_S = @finish_date AND Finish_Time_S = @finish_time AND Average_Part_Cycle_Time_S = @avarage_part AND Mode_S = @mode_p AND Length_S = @length_p) BEGIN INSERT INTO Silver_Robot(Program_S,Grpup_S,Start_Date_S,Start_Time_S,Pieces_S,Finish_Date_S,Finish_Time_S,Average_Part_Cycle_Time_S,Mode_S,Length_S) VALUES(@program,@group,@start_Date,@start_time,@pieces,@finish_date,@finish_time,@avarage_part,@mode_p,@length_p) END", conn);

它应该可以工作。

但是,正如您在第一个链接中看到的那样,创建存储过程可能是个好主意,因为在这种情况下您将获得更好的性能。

【讨论】:

    【解决方案2】:

    这就是我修复它的方法,到目前为止一切正常。

    我创建了一个程序

    USE [Electrical_ENG]
    GO
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[Silver_Robot_Insert] 
        @program varchar(50),
        @group varchar(50),
        @start_Date datetime,
        @start_time varchar(50),
        @pieces decimal,
        @finish_date datetime,
        @finish_time varchar(50),
        @avarage_part decimal,
        @mode_p varchar(50),
        @length_p decimal,
        @Total_Time_p decimal
    AS
    
    DECLARE @err_msg nvarchar(255);
    
    IF  NOT EXISTS(SELECT * FROM Silver_Robot WHERE Program_S=@program AND Grpup_S=@group AND Start_Date_S=@start_Date AND Start_Time_S=@start_time AND Pieces_S=@pieces AND Finish_Date_S=@finish_date AND Finish_Time_S=@finish_time AND Average_Part_Cycle_Time_S=@avarage_part AND Mode_S=@mode_p AND Length_S=@length_p AND Total_Time_S=@Total_Time_p)  
    BEGIN
        INSERT INTO Silver_Robot(Program_S,Grpup_S,Start_Date_S,Start_Time_S,Pieces_S,Finish_Date_S,Finish_Time_S,Average_Part_Cycle_Time_S,Mode_S,Length_S,Total_Time_S) 
        VALUES(@program,@group,@start_Date,@start_time,@pieces,@finish_date,@finish_time,@avarage_part,@mode_p,@length_p,@Total_Time_p)
    END
    

    插入:

    public void Insert_Silver_Robot(String Program_S, String Grpup_S, DateTime Start_Date_S, String Start_Time_S, Decimal Pieces_S, DateTime Finish_Date_S, String Finish_Time_S, double Average_Part_Cycle_Time_S, String Mode_S, double Length_S, double Total_Time_S)
            {
                using (SqlConnection conn = new SqlConnection())
                {
                    conn.ConnectionString = con_str_S3;
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = "Silver_Robot_Insert";
                    cmd.CommandType = CommandType.StoredProcedure;
    
    
                    cmd.Parameters.AddWithValue("@program", Program_S);
                    cmd.Parameters.AddWithValue("@group", Grpup_S);
                    cmd.Parameters.AddWithValue("@start_Date", Start_Date_S);
                    cmd.Parameters.AddWithValue("@start_time", Start_Time_S);
                    cmd.Parameters.AddWithValue("@pieces", Pieces_S);
                    cmd.Parameters.AddWithValue("@finish_date", Finish_Date_S);
                    cmd.Parameters.AddWithValue("@finish_time", Finish_Time_S);
                    cmd.Parameters.AddWithValue("@avarage_part", Average_Part_Cycle_Time_S);
                    cmd.Parameters.AddWithValue("@mode_p", Mode_S);
                    cmd.Parameters.AddWithValue("@length_p", Length_S);
                    cmd.Parameters.AddWithValue("@Total_Time_p", Total_Time_S);
    
                      //try
                    //{
                    conn.Open();
                    cmd.ExecuteNonQuery();
                    //}catch(Exception ex)
                    //{
                    //    MessageBox.Show(ex.Message);
                    //}
                    //finally
                    //{
                    //    if(con.State==ConnectionState.Open)
                    //    {
                    conn.Close();
                    //  }
                    // }
                }
            }
    

    在上传点击事件中:

    foreach (DataRow importRow in importData.Rows)
                    {
    
                        DateTime Start_Date_tt = ConvertStringToDate(importRow["Start date"].ToString());
                        DateTime Finish_Date_tt = ConvertStringToDate(importRow["Finish date"].ToString());
    
                        Decimal Pieces_tt = ConvertStringToDecimal(importRow["Pieces"].ToString());
                        double cycle_tt = ConvertStringToDouble(importRow["Average part cycle time"].ToString());
                        double length_tt = ConvertStringToDouble(importRow["Length_pa"].ToString());
                        double total_time_tt = cycle_tt * length_tt;
                        string program_tt = importRow["Program"].ToString();
                        string group_tt = importRow["Group"].ToString();
                        string start_time_tt = importRow["Start time"].ToString();
                        string finish_time_tt = importRow["Finish time"].ToString();
                        string mode_tt = importRow["Mode"].ToString();
                        dbactions.Insert_Silver_Robot(program_tt,group_tt,Start_Date_tt,start_time_tt,Pieces_tt,Finish_Date_tt,finish_time_tt,cycle_tt, mode_tt,length_tt,total_time_tt);
    
                    }
    

    再次使用 bulkinsert 将是执行此操作的最佳方式,但我无权在我的服务器中使用它。并感谢所有帮助。

    【讨论】:

      猜你喜欢
      • 2014-08-16
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 2012-12-14
      相关资源
      最近更新 更多