Member 14183767 Ответов: 2

Вставляйте записи excel один раз , без дубликатов


я вставляю в базу данных лист excel, я был в состоянии загрузить с именами листов и без них благодаря помощи группы , я просто хочу знать, как я могу предотвратить мой цикл от вставки данных несколько раз, например, если мой лист имеет 2 записи, цикл вставляет его дважды, и таблица в конечном итоге выглядит так: ............................
ID DOB ИМЯ ФАМИЛИЯ

1 1/02/1998 Джек Тернер

2 2/02/1989 Джилл синий

1 1/02/1998 Джек Тернер

2 2/02/1989 Джилл синий

я бы хотел, чтобы данные выглядели так после вставки:

ID DOB ИМЯ ФАМИЛИЯ

1 1/02/1998 Джек Тернер

2 2/02/1989 Джилл синий

Что я уже пробовал:

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);
        
        }

Gerry Schmitz

Я думаю, тебе нужно больше связей. Или создайте CSV-файл и "подключитесь" позже, как только вы разберетесь с "извлечением".

2 Ответов

Рейтинг:
2

Christian Graus

Если вы не можете проверить свои данные заранее, я бы предположил, что вам нужно искать запись, прежде чем вставлять ее, чтобы увидеть, существует ли она?


Member 14183767

привет , как я могу это сделать? разве данные не могут быть вставлены в datatable только один раз?

Christian Graus

https://www.techrepublic.com/blog/microsoft-office/prevent-duplicates-when-entering-data-into-excel/

К своему удивлению, я погуглил и нашел это

Member 14183767

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

Christian Graus

Excel - это не база данных. Куда они идут?

Member 14183767

лист excel загружается в таблицу данных, а затем я использую sql bulkcopy, чтобы вставить его в свою таблицу базы данных

Christian Graus

Это чертовски странно, но тогда вы можете использовать триггер для отклонения дубликатов в массовой вставке

Member 14183767

что такое спусковой крючок? и как мне им пользоваться?

Christian Graus

Умение гуглить - жизненно важный навык для разработчика

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-201711111

Рейтинг:
0

Member 14183767

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

ссылка: href="https://stackoverflow.com/questions/1438083/getting-the-first-sheet-from-an-excel-document-regardless-of-sheet-name-with-ole"

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