2015-03-04 20 views
5

Sto usando il seguente codice per inserire i record di una tabella in SQL Server 2014modo migliore per fare gli inserimenti di massa utilizzando dapper.net

using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["myConnString"])) 
{ 

    conn.Execute("INSERT statement here", insertList); 

} 

Il insertList è una lista che ha 1 milione di articoli in esso. Ho testato questo inserto su un desktop i5 e ci sono voluti circa 65 minuti per inserire un milione di record su SQL Server sullo stesso computer. Non sono sicuro di quanto stia facendo gli inserti dietro le quinte. Non voglio certo aprire e chiudere la connessione al database un milione di volte!

È questo il modo migliore per fare inserimenti di massa in dapper o dovrei provare qualcos'altro o andare con semplice ADO.Net utilizzando la libreria Enterprise?

EDIT

Col senno di poi, lo so utilizzando ADO.Net sarà meglio, così sarà riformulare la mia domanda. Mi piacerebbe ancora sapere se questo è il migliore che può fare il dapper o mi sto perdendo un modo migliore di farlo dapper in sé?

+1

[A inserimento di massa] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx) funziona con un 'IDataReader' ... in modo che il principale la sfida è creare uno schema e un dataReader che dia accesso ai nomi delle colonne alle proprietà ... –

+1

usa una sp e passa l'elenco al tipo di tabella definito dall'utente nel DB –

+0

https://github.com/tmsmith/Dapper-Extensions/ issues/18: http://stackoverflow.com/questions/9946287/correct-method-of-deleting-over-2100-rows-by-id-with-dapper/9947259#9947259 (che ha lo svantaggio principale di creare un mostro di memoria chiamato 'DataTable' ...) –

risposta

5

Basandosi sul commento di Ehsan Sajjad, uno dei modi è scrivere una stored procedure che abbia un parametro READONLY di uno user-defined TABLE type.

dire che si desidera contatti inserimento di massa che consistono di un nome e cognome, questo è come si dovrebbe andare a questo proposito: 1) Creare un tipo di tabella:

CREATE TYPE [dbo].[MyTableType] AS TABLE(
    [FirstName] [varchar](50) NULL, 
    [LastName] [varchar](50) NULL 
) 
GO 

2) Ora creare un proc memorizzato che utilizza il tipo di tabella precedente:

CREATE PROC [dbo].[YourProc] 
/*other params here*/ 
@Names AS MyTableType READONLY 
AS 
/* proc body here 
*/ 
GO 

3) Sul lato NET, passare il parametro come System.Data.SqlDbType.Structured Questo solitamente comporta la creazione di un in memoria tabella dati, poi aggiungendo le righe e quindi utilizzando questo DataTa ble oggetto come parametro @Names. NOTA: DataTable è considerato ad alta intensità di memoria: fare attenzione e profilare il codice per assicurarsi che non causi problemi di risorse sul server.

altenative SOLUZIONE Utilizzare l'approccio qui delineato: https://stackoverflow.com/a/9947259/190476 La soluzione è DELETE ma può essere adattato per un inserimento o aggiornare pure.

4

Il modo migliore per inserire con prestazioni eccellenti è utilizzare la classe SqlBulkCopy direttamente come suggerito da Alex e Andreas.

Diniego: Sono il titolare del progetto Dapper Plus

Questo progetto fornisce un facile supporto per le seguenti operazioni:

  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

Utilizzando la mappatura e consenti il ​​valore di output come colonne di identità.

// CONFIGURE & MAP entity 
DapperPlusManager.Entity<Order>() 
       .Table("Orders") 
       .Identity(x => x.ID); 

// CHAIN & SAVE entity 
connection.BulkInsert(orders) 
      .AlsoInsert(order => order.Items); 
      .Include(x => x.ThenMerge(order => order.Invoice) 
         .AlsoMerge(invoice => invoice.Items)) 
      .AlsoMerge(x => x.ShippingAddress); 
+4

Questa risposta è appropr iate e aggiunge valore. Non dovrebbe essere downvoted. – Seth

+1

@ JonathanMagnan, non è chiaro se Dapper Plus ha la versione gratuita e come si differenzia dalla versione Pro? –

+0

Ciao @ArsenMkrtchyan, non esiste una versione "GRATUITA". Puoi, tuttavia, provarlo gratuitamente per un tempo illimitato finché non sei pronto per la produzione. Rivedremo presto tutti i nostri prodotti per renderlo chiaro. –