Modo per capire se l'operazione SqlBulkCopy inserito valori o no

c# sqlbulkcopy

Domanda

Ho un metodo SqlBulkCopy che inserisce. La tabella di destinazione a cui si inserisce ha definito un vincolo di chiave univoca, pertanto la copia di massa non inserisce duplicati. Ma dal momento che la restrizione è solo a livello di database, non sono in grado di verificare a livello di codice se l'inserimento è stato fatto o meno. Ecco il mio metodo:

string connect = "user id=*********; password=*******; server=.\\SQLEXPRESS;database=*********;";
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connect, SqlBulkCopyOptions.UseInternalTransaction))
    {
        bulkCopy.DestinationTableName = "dbo.BaseTermPrice";
        bulkCopy.ColumnMappings.Add("BaseID", "BaseID");
        bulkCopy.ColumnMappings.Add("ContractDate", "ContractDate");
        bulkCopy.ColumnMappings.Add("TermID", "TermID");
        bulkCopy.ColumnMappings.Add("Price", "Price");
        bulkCopy.ColumnMappings.Add("PeakType", "PeakType");
        try
        {
            // Write from the source to the destination.
            bulkCopy.WriteToServer(ds.Tables[0]);
        }
        catch (SqlException ex)
        {
            success = false;
            logger.Error(ex.Message);
        }
        catch (Exception ex)
        {
            success = false;
            logger.Error(ex.Message);
        }
    }

Non c'è eccezione da qui quando non si inserisce nessun inserto. Come posso determinare questo in modo che possa informare l'utente che sta cercando di inserire i duplicati?

Il mio vincolo di chiave univoca:

ALTER TABLE [dbo].[BaseTermPrice] ADD  CONSTRAINT [UK_BaseTermPrice] UNIQUE NONCLUSTERED 
(
[BaseID] ASC,
[ContractDate] ASC,
[TermID] ASC,
[PeakType] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
SORT_IN_TEMPDB = OFF, 
IGNORE_DUP_KEY = OFF, 
ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, 
ALLOW_PAGE_LOCKS  = ON) 
ON [PRIMARY]
GO

Risposta accettata

Non c'è eccezione da qui quando non si inserisce nessun inserto.

Hai fatto un indice univoco IGNORE_DUP_KEY = ON ? Questa è una cattiva pratica perché nasconde errori nei dati.

Se questa opzione è falsa, un'operazione di inserimento di massa genererà un'eccezione. Se sembra che non lo faccia, allora il tuo errore di registrazione è rotto. Imposta il debugger per interrompere tutte le eccezioni.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow