Saltar al contenido

SqlBulkCopy de una lista

No dudes en divulgar nuestra web y códigos en tus redes sociales, ayúdanos a ampliar esta comunidad.

Solución:

Con FastMember, puede hacer esto sin necesidad de pasar por DataTable (que, en mis pruebas, más del doble del rendimiento):

using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description"))

    bcp.DestinationTableName = "SomeTable";
    bcp.WriteToServer(reader);

Tenga en cuenta que ObjectReader también puede trabajar con fuentes no genéricas, y no es necesario especificar los nombres de los miembros de antemano (aunque probablemente desee usar el ColumnMappings aspecto de SqlBulkCopy si no los especifica en el ObjectReader sí mismo).

Simplemente cree un DataTable de su lista de objetos y llame SqlBulkCopy.WriteToServerpasando la tabla de datos.

Puede encontrar lo siguiente útil:

  • Agregar columnas a un DataTable. Agregue una columna para cada propiedad/campo que desee escribir.
  • Agregar filas a un DataTable. Agregue una fila para cada objeto en su lista.

Para obtener el máximo rendimiento con SqlBulkCopy, debe establecer un BatchSize adecuado. 10,000 parece funcionar bien, pero perfile sus datos.

También puede observar mejores resultados al usar SqlBulkCopyOptions.TableLock.

Puede encontrar un análisis interesante e informativo del rendimiento de SqlBulkCopy aquí.

Tarde a la fiesta, pero si le sumas esto EntityDataReader clase de Microsoft, hay una AsDataReader() método de extensión que hace exactamente eso: https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs

(ejemplo [List].AsDataReader() implementación:)

var connStr = "";
using (var connection = new SqlConnection(connStr)) 

    var startTime = DateTime.Now;
    connection.Open();
    var transaction = connection.BeginTransaction();
    try
    
        //var connStr = connection.ConnectionString;
        using (var sbCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
        
            sbCopy.BulkCopyTimeout = 0;
            sbCopy.BatchSize = 10000;
            sbCopy.DestinationTableName = "Foobars";
            var reader = Foobars.AsDataReader();
            sbCopy.WriteToServer(reader);
        
        transaction.Commit();
    
    catch (Exception ex)
    
        Console.WriteLine(ex.Message);
        transaction.Rollback();
    
    finally
    
        transaction.Dispose();
        connection.Close();
        var endTime = DateTime.Now;
        Console.WriteLine("Upload time elapsed: 0 seconds", (endTime - startTime).TotalSeconds);
    

Comentarios y valoraciones

Si te sientes suscitado, tienes la habilidad dejar una reseña acerca de qué le añadirías a esta división.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *