как исправить повторяющуюся вставку записей Excel в базу данных

Я вставляю в базу данных Excel лист, мне удалось загрузить с именами листов и без них, я просто хочу знать, как я могу предотвратить многократную вставку данных, например. если на моем листе 2 записи, цикл вставляет их дважды, и таблица выглядит так:

ID  DOB       NAME  SURNAME 
1   1/02/1998 jack  turner
2   2/02/1989 jill  blue
1   1/02/1998 jack  turner
2   2/02/1989 jill  blue

Код:

public void up(string sFileName = @"filename") { 

    string ssqltable = "[dbo].[My_Table]";
    //string sFileName = @"filename";

    try{
        string sConStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES';", sFileName);
        DataTable dt = new DataTable();
        SqlConnection sqlconn = new SqlConnection(strConnString);

        sqlconn.Open();
        using (OleDbConnection connection = new OleDbConnection(sConStr))
        {
            connection.Open();
            dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
            var sheets = dt.Rows[0].Field<string>("TABLE_NAME");
            foreach(var sheet in sheets) //loop through the collection of sheets ;)
            {
                //your logic here...
                string myexceldataquery = string.Format("Select * FROM [{0}]; ", sheets);
                //get data

                OleDbConnection oledbconn = new OleDbConnection(sConStr);
                OleDbCommand oledbcmd = new OleDbCommand(myexceldataquery, oledbconn);
                oledbconn.Open();                 
                OleDbDataReader dr = oledbcmd.ExecuteReader();
                {
                    DataTable table = new DataTable("benlist");
                    table.Load(dr);
                    // add two extra columns to data table to be added to database table
                    table.Columns.Add("name",typeof(string));
                    table.Columns.Add("surname",typeof(string));
                    // add data to additional columns
                    foreach (DataRow row in table.Rows){
                        row["name"] =Session["Username"].ToString();
                        row["surname"] = Session["Username"].ToString();
                    }
                    SqlBulkCopy bulkcopy = new SqlBulkCopy(strConnString);
                    bulkcopy.DestinationTableName = ssqltable;
                    ////Mapping Table column    
                    bulkcopy.ColumnMappings.Add("IDNumber", "[IDNumber]");
                    bulkcopy.ColumnMappings.Add("DOB", "[DOB]");
                    bulkcopy.ColumnMappings.Add("name", "[name]");
                    bulkcopy.ColumnMappings.Add("surname", "[surname]");

                    //sqlcmd.ExecuteNonQuery();
                    //while (dr.Read())
                    //{
                        bulkcopy.WriteToServer(table);
                    //}
                    connection.Close();
                    sqlconn.Close();
                }
            }
        }   
    }
    catch (Exception){}
    ClientScript.RegisterStartupScript(GetType(), "alert", "alert('File Uploaded');", true);
}

Я ожидаю, что данные будут вставлены, если не будет дубликатов, например

ID  DOB       NAME  SURNAME 
1   1/02/1998 jack  turner
2   2/02/1989 jill  blue

person Makaziwe    schedule 03.05.2019    source источник
comment
Вы можете удалить обман из таблицы данных с помощью ToTable (true)   -  person xdtTransform    schedule 03.05.2019
comment
привет, я могу удалить дубликаты из таблицы данных DataTable table = new DataTable (benlist), в которую я загружаю свои данные Excel? не могли бы вы показать мне пример ToTable (правда)?   -  person Makaziwe    schedule 03.05.2019
comment
Из docsoft doc..   -  person xdtTransform    schedule 03.05.2019
comment
проблема в том, что данные вставляются несколько раз при запуске цикла, есть ли способ исправить это, чтобы цикл запускался и после того, как данные были вставлены в datatable в первый раз, когда он останавливается   -  person Makaziwe    schedule 03.05.2019
comment
Обман - это не волшебство, это источник данных, поэтому вам нужно очистить данные перед вставкой обмана. Либо создайте коллекцию, в которой не допускаются повторяющиеся значения, либо удалите их.   -  person xdtTransform    schedule 03.05.2019
comment
Это был я, Excell для IEnumerable ‹CustomeObject›, Очистите список, чтобы проект был успешно обработан для объекта базы данных. Затем быстрый член Gravell в SqlCopy.   -  person xdtTransform    schedule 03.05.2019
comment
не уверен, что мы на той же странице, источник данных не имеет дубликатов, я знаю это, потому что я вставил с помощью Select * FROM [sheet1 $], где я знал имена моих листов, и это нормально, я добавил цикл для GetOleDbSchemaTable по порядку для загрузки листов, названия которых я не знаю   -  person Makaziwe    schedule 03.05.2019
comment
Sheet2 имеет те же данные, что и Sheet1? Как я уже сказал, нет волшебного дубликата, либо обман находится в таблице (bulkcopy.WriteToServer (table);), либо вы делаете это дважды.   -  person xdtTransform    schedule 03.05.2019
comment
в файле Excel только один лист, я загружаю лист Excel в свою базу данных, имена листов неизвестны, поэтому я использовал dt = connection.GetOleDbSchemaTable (OleDbSchemaGuid.Tables, new object [] {null, null, null, TABLE}) ; и пролистайте их, чтобы найти имена листов. если на листе 2 записи, мой цикл будет выполняться дважды, в результате чего данные будут вставлены дважды   -  person Makaziwe    schedule 03.05.2019


Ответы (1)


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

ссылка: Получение первый лист из документа Excel независимо от имени листа с OleDb

using (OleDbConnection connection = new OleDbConnection(sConStr))
    {
        connection.Open();
        /// get sheet name
       dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
       //var sheets = dt.Rows[0].Field<string>("TABLE_NAME");
       // foreach(var sheet in sheets) //loop through the collection of sheets ;)
       // {
       var sheets = dt.Rows[0].Field<string>("TABLE_NAME");
            //your logic here...
                    string myexceldataquery = string.Format("Select * FROM [{0}]; ", sheets);
                    //get data
person Makaziwe    schedule 03.05.2019