Insertar muchas filas con Dapper

.net ado.net c# dapper sqlconnection

Pregunta

¿Cuál es la mejor solución para insertar muchas filas en el Servidor SQL con Dapper? Cuando tengo unos 8k registra mis tiempos de espera de conexión de la base de datos y falla.

En mi aplicación en la etapa final, tengo una lista de tablas, donde cada tabla tiene una lista de filas.

Lo que hago es crear transacciones y foreaching en cada tabla y luego foreaching en cada fila y conn.CreateCommand, llenando los parámetros y executeNonQuery. Entonces, si tengo 9k registros, en realidad estoy haciendo 9k operaciones executeNonQuery.

¿Hay alguna mejor opción para mí?

Respuesta aceptada

De acuerdo con DaniCE, SqlBulkCopy es el camino a seguir aquí. He estado en esa situación últimamente, donde hice la mayor parte del trabajo de datos con apuesto, pero con una gran cantidad de datos, en mi caso millones de registros, Dapper fue por una vez no mi mejor amigo.

    private void BulkCopy(SqlConnection sqlConnection,string tableName, DataTable dataTable)
    {
        using (var bulkCopy = new SqlBulkCopy(sqlConnection))
        {
            bulkCopy.DestinationTableName = tableName;
            bulkCopy.BatchSize = 50000;
            bulkCopy.BulkCopyTimeout = 60; //seconds

            bulkCopy.WriteToServer(dataTable);
        }
    }

Respuesta experta

La mejor forma gratuita es sin lugar a dudas SqlBulkCopy como @JFM y @DaniCE sugirieron


Descargo de responsabilidad : soy el propietario del proyecto Dapper Plus

Esta biblioteca NO ES GRATUITA, pero proporciona un soporte sencillo para las siguientes operaciones:

  • BulkInsert
  • Actualización masiva
  • BulkDelete
  • BulkMerge
  • BulkSynchronize

Al usar el mapeo y permitir el valor de salida como columnas de identidad.

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué