Попытка избежать повторяющихся записей для вставки SQL из импорта файла CSV - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь импортировать данные файла 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();
                }

            }
        }

Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вот как я это исправил, и пока все работает отлично.

Я создал процедуру

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 будетлучший способ сделать это, но у меня нет разрешения использовать его на моем сервере.И спасибо за помощь.

0 голосов
/ 31 мая 2018

Вы можете просто использовать IF NOT EXIST в SQL: https://forums.asp.net/t/1738957.aspx?SqlCommand+with+IF+NOT+EXISTS+statement

Вставка в SQL Server, если не существует

Так что, вероятно, если вы просто замените команду 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);

должно работать.

Но, как вы можете видеть в первой ссылке, это может быть хорошей идеей длясоздайте хранимую процедуру, потому что в этом случае у вас будет лучшая производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...