Inserimento di massa nella tabella esistente: inserire solo nuove righe

c# sqlbulkcopy sql-server

Domanda

Ho un metodo per ottenere dati dalla tabella esistente nel database come DataTable e voglio aggiungere nuove righe a tale datatable e quindi utilizzare SQLBulkCopy per inserire solo le nuove righe aggiunte e non le righe già esistenti, devo configurare questo in qualche modo o aggiungerà comunque solo le nuove righe?

var myDataTable = GetExistingTableDataAsDataTable();

// aggiungi nuove righe a myDataTable .....

using (var conn = new SqlConnection("Connection string"))
    {
        conn.Open();

        using (var bulk = new SqlBulkCopy(conn))
        {
            bulk.DestinationTableName = myDataTable.TableName;
            bulk.BatchSize = 1000;

            foreach (var column in myDataTable.Columns)
            {
                bulk.ColumnMappings.Add(column.ToString(), column.ToString());   
            }

            bulk.WriteToServer(myDataTable); //Do i need to add DataRowState.Added here?
            bulk.Close();
        }

        conn.Close();
    }

Risposta popolare

Utilizzare una tabella temporanea per l' bulk insert . Poi, eseguire una query per copiare nuove righe sopra, filtrando duplicati con un where clausola:

insert  YourTable
        (id, col1, col2, col3, ...)
select  id
,       col1
,       col2
,       col3
,       ...
from    TempTable t
where   not exists
        (
        select  *
        from    YourTable yt
        where   yt.id = t.id
        )


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché